From 59114e5fd5469d508ded39ebeeb257837df4e31f Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 17 Oct 2024 20:59:02 -0400 Subject: [PATCH 01/35] Check weights --- .../ERC20TokenStakingManager.go | 4 +- .../NativeTokenStakingManager.go | 4 +- .../PoAValidatorManager.go | 4 +- .../validator-manager/ValidatorManager.sol | 13 +++ .../tests/ERC20TokenStakingManagerTests.t.sol | 53 +++++++----- .../NativeTokenStakingManagerTests.t.sol | 48 ++++++----- .../tests/PoAValidatorManagerTests.t.sol | 29 ++++--- .../tests/ValidatorManagerTests.t.sol | 85 ++++++++++++++++++- 8 files changed, 178 insertions(+), 62 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index c6cd32649..0c4648437 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -90,8 +90,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f8b380380615f8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e3e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b61020961020436600461505c565b6104a8565b005b610209610219366004615097565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b36600461505c565b6106eb565b61020961025e3660046150ae565b6106f6565b6102096102713660046150fc565b610be2565b610289610284366004615097565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb36600461505c565b610c6c565b6102096102de36600461511d565b610c77565b6102f66102f136600461515d565b610d39565b604051908152602001610234565b6102096103123660046151c2565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f66103423660046151ea565b610fd9565b610289610355366004615097565b610ff2565b6102f65f81565b61020961036f36600461505c565b611006565b610226603081565b61020961038a366004615097565b611031565b61020961039d3660046151c2565b6110fc565b6102f66103b0366004615203565b6112d4565b6102096103c336600461511d565b611300565b6102f65f80516020615db283398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004615097565b611489565b6102f65f80516020615dd283398151915281565b610209610437366004615097565b611672565b610226601481565b610457610452366004615097565b6117af565b6040516102349190615298565b6102896202a30081565b6102f65f80516020615d9283398151915281565b61020961049036600461532c565b6118fe565b6102f66104a336600461536a565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff16600581111561052a5761052a615223565b600581111561053b5761053b615223565b815260200160018201805461054f906153d5565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906153d5565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063157610631615223565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d46565b6040518263ffffffff1660e01b81526004016106a5919061541b565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e5919061542d565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615dd28339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af919061542d565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e96060850160408601615444565b6001600160a01b03161461082c576108076060840160408501615444565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a606085018561545f565b905090505f805b828163ffffffff161015610b22575f61085d606088018861545f565b8363ffffffff16818110610873576108736154a4565b905060200281019061088591906154b8565b61088e906155dc565b80516040519192505f9160088801916108a691615655565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf919060040161541b565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f91615655565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d919061542d565b90508086600801835f01516040516109759190615655565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f7615223565b021790555060208201516001820190610a1090826156aa565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab5911685615779565b8251604051919550610ac691615655565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b9061578c565b9050610841565b50600483018190555f610b40610b3786611d95565b60400151611eab565b90505f610b4c87612038565b90505f600282604051610b5f9190615655565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d919061542d565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612212565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c615223565b14610c4c578060405163170cc93360e21b81526004016104cf919061540d565b6106e5838361224d565b5f610c6664e8d4a51000836157ae565b92915050565b6106e58383836124c7565b610c7f6126c0565b5f80516020615db28339815191525f80610c98846126f7565b91509150610ca582612212565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce0615223565b03610d05575f83815260078501602052604081208054919055610d038282612a35565b505b610d1b81610d168460400151610fd9565b612aab565b505050505b610d3660015f80516020615df283398151915255565b50565b5f610d426126c0565b610d4e85858585612ae1565b9050610d6660015f80516020615df283398151915255565b949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115610dbb57610dbb615223565b6003811115610dcc57610dcc615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e59615223565b14610e7a578251604051633b0d540d60e21b81526104cf91906004016157cd565b600481516005811115610e8f57610e8f615223565b03610ea557610e9d85612cba565b505050505050565b5f80610ebc610eb389611d95565b60400151612ea1565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a510006157e7565b5f610ffc826117af565b6080015192915050565b6110118383836124c7565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615db28339815191525f611049836117af565b519050600481600581111561106057611060615223565b14611080578060405163170cc93360e21b81526004016104cf919061540d565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a35565b6111046126c0565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff16600381111561115157611151615223565b600381111561116257611162615223565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db615223565b146111fc578051604051633b0d540d60e21b81526104cf91906004016157cd565b600461120b82604001516117af565b51600581111561121d5761121d615223565b146112af575f61122c85611d95565b90505f8061123d8360400151612ea1565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612cba565b50506112d060015f80516020615df283398151915255565b5050565b5f6112dd6126c0565b6112e88333846130f7565b9050610c6660015f80516020615df283398151915255565b5f80516020615dd28339815191525f8061132561131c85611d95565b604001516133cf565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f82815260068401602052604090208054611365906153d5565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af615223565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068401602052604081206113fa91614fab565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff1660038111156114d6576114d6615223565b60038111156114e7576114e7615223565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561156057611560615223565b14158015611581575060038151600381111561157e5761157e615223565b14155b156115a2578051604051633b0d540d60e21b81526104cf91906004016157cd565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d46565b6040518263ffffffff1660e01b815260040161162b919061541b565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b919061542d565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615dd283398151915291906116b9906153d5565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff16600581111561170357611703615223565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016157fe565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d8919061542d565b6117b7614fe2565b5f8281525f80516020615e12833981519152602052604090819020815160e0810190925280545f80516020615dd2833981519152929190829060ff16600581111561180457611804615223565b600581111561181557611815615223565b8152602001600182018054611829906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611855906153d5565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611990848461358b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615dd2833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615888565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db28339815191529284929091829060ff166003811115611a8657611a86615223565b6003811115611a9757611a97615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b24615223565b14611b45578251604051633b0d540d60e21b81526104cf91906004016157cd565b60208301516001600160a01b03163314611be8575f828152600485016020526040902054336001600160a01b0390911603611be2575f82815260048501602052604090205460a0820151611ba991600160b01b90046001600160401b031690615897565b6001600160401b0316421015611bdd5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b611be8565b336110a1565b600281516005811115611bfd57611bfd615223565b03611cda578615611c1457611c12828761224d565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c4d918491611c4891906158b7565b6135a5565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c8e846136fc565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d3f9350505050565b600481516005811115611cef57611cef615223565b03611d2357611cfd836136fc565b5f898152600686016020526040902055611d1688612cba565b6001945050505050611d3f565b805160405163170cc93360e21b81526104cf919060040161540d565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e2091908101906158e2565b9150915080611e4257604051636b2f19e960e01b815260040160405180910390fd5b815115611e68578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611ea4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611ee057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f2f57611ef78160016159b4565b611f029060086157e7565b61ffff16848281518110611f1857611f186154a4565b016020015160f81c901b9190911790600101611ee3565b5061ffff811615611f595760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611fb457611f708160036159b4565b611f7b9060086157e7565b63ffffffff1685611f8d836002615779565b81518110611f9d57611f9d6154a4565b016020015160f81c901b9190911790600101611f5c565b5063ffffffff811615611fda57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561202f57611ff181601f6159b4565b611ffc9060086157e7565b86612008836006615779565b81518110612018576120186154a4565b016020015160f81c901b9190911790600101611fdd565b50949350505050565b60605f8083356020850135601461205487870160408901615444565b612061606089018961545f565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6120e7606085018561545f565b9050811015611ea457816120fe606086018661545f565b8381811061210e5761210e6154a4565b905060200281019061212091906154b8565b61212a90806159c7565b9050612139606087018761545f565b84818110612149576121496154a4565b905060200281019061215b91906154b8565b61216590806159c7565b612172606089018961545f565b86818110612182576121826154a4565b905060200281019061219491906154b8565b6121a29060208101906159c7565b6121af60608b018b61545f565b888181106121bf576121bf6154a4565b90506020028101906121d191906154b8565b6121e29060608101906040016151ea565b6040516020016121f89796959493929190615a09565b60408051601f1981840301815291905291506001016120da565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612298573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122bf91908101906158e2565b91509150806122e157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612324573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612348919061542d565b82511461236e578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123aa576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f806123b984604001516138a8565b915091508187146123e05760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615db2833981519152906001600160401b03908116908316111561249d575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26124bc565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615db2833981519152816124e086613a99565b90506124eb86612212565b6124fa57600192505050611d3f565b5f8681526004830160205260409020546001600160a01b0316331461251f57336110a1565b5f86815260048301602052604090205460a082015161254e91600160b01b90046001600160401b031690615897565b6001600160401b03168160c001516001600160401b031610156125955760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125ad576125a6878661224d565b90506125cb565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906125f090610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268a919061542d565b905080846007015f8a81526020019081526020015f205f8282546126ae9190615779565b90915550501515979650505050505050565b5f80516020615df28339815191528054600119016126f157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612700614fe2565b5f80516020615dd28339815191525f8061271c61131c87611d95565b91509150801561274357604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561277457612774615223565b600581111561278557612785615223565b8152602001600182018054612799906153d5565b80601f01602080910402602001604051908101604052809291908181526020018280546127c5906153d5565b80156128105780601f106127e757610100808354040283529160200191612810565b820191905f5260205f20905b8154815290600101906020018083116127f357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561287b5761287b615223565b1415801561289c575060018151600581111561289957612899615223565b14155b156128bd57805160405163170cc93360e21b81526104cf919060040161540d565b6003815160058111156128d2576128d2615223565b036128e057600481526128e5565b600581525b8360080181602001516040516128fb9190615655565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561293f5761293f615223565b02179055506020820151600182019061295890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129fe576129fe615223565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a90575f80fd5b505af1158015612aa2573d5f803e3d5ffd5b50505050505050565b5f80516020615d92833981519152546112d0906001600160a01b03168383613d7d565b60015f80516020615df283398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615db283398151915290600160401b900461ffff9081169086161080612b35575061271061ffff8616115b15612b5957604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b95576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612ba75750806001015483115b15612bc85760405163222d164360e21b8152600481018490526024016104cf565b5f612bd284613ddc565b90505f612bde82610c56565b90505f612beb8983613dff565b90506040518060800160405280612bff3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115612d0757612d07615223565b6003811115612d1857612d18615223565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e46575f84815260048701602052604090205461271090612df890600160a01b900461ffff16856157e7565b612e0291906157ae565b915081866007015f8681526020019081526020015f205f828254612e269190615779565b90915550612e36905082846159b4565b9050612e46856020015182612a35565b612e5b8560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ed857835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f2757612eef8160016159b4565b612efa9060086157e7565b61ffff16868281518110612f1057612f106154a4565b016020015160f81c901b9190911790600101612edb565b5061ffff811615612f515760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612fac57612f688160036159b4565b612f739060086157e7565b63ffffffff1687612f85836002615779565b81518110612f9557612f956154a4565b016020015160f81c901b9190911790600101612f54565b5063ffffffff8116600314612fd457604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561302957612feb81601f6159b4565b612ff69060086157e7565b88613002836006615779565b81518110613012576130126154a4565b016020015160f81c901b9190911790600101612fd7565b505f805b6008811015613088576130418160076159b4565b61304c9060086157e7565b6001600160401b031689613061836026615779565b81518110613071576130716154a4565b016020015160f81c901b919091179060010161302d565b505f805b60088110156130e7576130a08160076159b4565b6130ab9060086157e7565b6001600160401b03168a6130c083602e615779565b815181106130d0576130d06154a4565b016020015160f81c901b919091179060010161308c565b5091989097509095509350505050565b5f5f80516020615db28339815191528161311361028485613ddc565b90505f61311f876117af565b905061312a87612212565b61314a576040516330efa98b60e01b8152600481018890526024016104cf565b60028151600581111561315f5761315f615223565b1461318057805160405163170cc93360e21b81526104cf919060040161540d565b5f8282608001516131919190615897565b905083600201600a9054906101000a90046001600160401b031682604001516131ba9190615a72565b6001600160401b0316816001600160401b031611156131f757604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806132038a846135a5565b915091505f8a8360405160200161323192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132c4576132c4615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461340557825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156134545761341c8160016159b4565b6134279060086157e7565b61ffff1685828151811061343d5761343d6154a4565b016020015160f81c901b9190911790600101613408565b5061ffff81161561347e5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134d9576134958160036159b4565b6134a09060086157e7565b63ffffffff16866134b2836002615779565b815181106134c2576134c26154a4565b016020015160f81c901b9190911790600101613481565b5063ffffffff811660021461350157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135565761351881601f6159b4565b6135239060086157e7565b8761352f836006615779565b8151811061353f5761353f6154a4565b016020015160f81c901b9190911790600101613504565b505f8660268151811061356b5761356b6154a4565b016020015191976001600160f81b03199092161515965090945050505050565b613593614377565b61359c826143c2565b6112d081614430565b5f8281525f80516020615e12833981519152602052604081206002015481905f80516020615dd283398151915290600160801b90046001600160401b03166135ed8582614498565b5f6135f787614672565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136478a858b611d46565b6040518263ffffffff1660e01b8152600401613663919061541b565b6020604051808303815f875af115801561367f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a3919061542d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615db283398151915290505f61371c84604001516117af565b90505f60038251600581111561373457613734615223565b1480613752575060048251600581111561375057613750615223565b145b15613762575060c081015161379f565b60028251600581111561377757613777615223565b0361378357504261379f565b815160405163170cc93360e21b81526104cf919060040161540d565b84608001516001600160401b0316816001600160401b0316116137c657505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137eb90610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561387b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061389f919061542d565b95945050505050565b5f808251602e146138de57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b600281101561392d576138f58160016159b4565b6139009060086157e7565b61ffff16858281518110613916576139166154a4565b016020015160f81c901b91909117906001016138e1565b5061ffff8116156139575760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139b25761396e8160036159b4565b6139799060086157e7565b63ffffffff168661398b836002615779565b8151811061399b5761399b6154a4565b016020015160f81c901b919091179060010161395a565b5063ffffffff8116156139d857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a2d576139ef81601f6159b4565b6139fa9060086157e7565b87613a06836006615779565b81518110613a1657613a166154a4565b016020015160f81c901b91909117906001016139db565b505f805b6008811015613a8c57613a458160076159b4565b613a509060086157e7565b6001600160401b031688613a65836026615779565b81518110613a7557613a756154a4565b016020015160f81c901b9190911790600101613a31565b5090969095509350505050565b613aa1614fe2565b5f8281525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff166005811115613aee57613aee615223565b6005811115613aff57613aff615223565b8152602001600182018054613b13906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054613b3f906153d5565b8015613b8a5780601f10613b6157610100808354040283529160200191613b8a565b820191905f5260205f20905b815481529060010190602001808311613b6d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613bf857613bf8615223565b14613c2b575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c6f57613c6f615223565b021790555060208201516001820190613c8890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d2685826135a5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146e7565b5f610c66825f80516020615d92833981519152546001600160a01b031690614748565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e4357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615dd283398151915242613e6260608601604087016151ea565b6001600160401b0316111580613e9c5750613e806202a30042615779565b613e9060608601604087016151ea565b6001600160401b031610155b15613ed657613eb160608501604086016151ea565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613eeb613ee66060860186615a9d565b6148a1565b613efb613ee66080860186615a9d565b6030613f0a60208601866159c7565b905014613f3c57613f1e60208501856159c7565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f4684806159c7565b90505f03613f7357613f5884806159c7565b604051633e08a12560e11b81526004016104cf929190615ab1565b5f60088201613f8286806159c7565b604051613f90929190615888565b90815260200160405180910390205414613fc957613fae84806159c7565b60405163a41f772f60e01b81526004016104cf929190615ab1565b613fd3835f614498565b6040805160e08101909152815481525f9081906140df9060208101613ff889806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614040908a018a6159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161408960608a0160408b016151ea565b6001600160401b031681526020016140a460608a018a615a9d565b6140ad90615adf565b81526020016140bf60808a018a615a9d565b6140c890615adf565b8152602001876001600160401b0316815250614a0a565b5f828152600686016020526040902091935091506140fd82826156aa565b50816008840161410d88806159c7565b60405161411b929190615888565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061415790859060040161541b565b6020604051808303815f875af1158015614173573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614197919061542d565b6040805160e0810190915290915080600181526020016141b789806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561424657614246615223565b02179055506020820151600182019061425f90826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806142fd88806159c7565b60405161430b929190615888565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061434991906151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143c057604051631afcd79f60e31b815260040160405180910390fd5b565b6143ca614377565b6143d381614bf7565b6143db614c10565b610d36606082013560808301356143f860c0850160a086016151ea565b61440860e0860160c08701615ba6565b614419610100870160e08801615bbf565b61442b61012088016101008901615444565b614c20565b614438614377565b5f80516020615d928339815191526001600160a01b03821661447857604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615dd28339815191525f6001600160401b0380841690851611156144cc576144c583856158b7565b90506144d9565b6144d684846158b7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061453b575060018401548151614537916001600160401b031690615779565b8210155b15614561576001600160401b038316606082015281815260408101516020820152614580565b82816060018181516145739190615897565b6001600160401b03169052505b6060810151614590906064615a72565b602082015160018601546001600160401b0392909216916145bb9190600160401b900460ff166157e7565b10156145eb57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516146069190615779565b9052506040810180516001600160401b03871691906146269083906159b4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615e128339815191526020526040812060020180545f80516020615dd283398151915291906008906146bc90600160401b90046001600160401b0316615bdf565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146fb6001600160a01b03841683614d4f565b905080515f1415801561471f57508080602001905181019061471d9190615bfa565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561478e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147b2919061542d565b90506147c96001600160a01b038516333086614d5c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561480d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614831919061542d565b90508181116148975760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b61389f82826159b4565b6148ae602082018261511d565b63ffffffff161580156148ce57506148c9602082018261545f565b151590505b15614915576148e0602082018261511d565b6148ed602083018361545f565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b614922602082018261545f565b9050614931602083018361511d565b63ffffffff16111561494a576148e0602082018261511d565b60015b61495a602083018361545f565b90508110156112d057614970602083018361545f565b61497b6001846159b4565b81811061498a5761498a6154a4565b905060200201602081019061499f9190615444565b6001600160a01b03166149b5602084018461545f565b838181106149c5576149c56154a4565b90506020020160208101906149da9190615444565b6001600160a01b03161015614a0257604051630dbc8d5f60e31b815260040160405180910390fd5b60010161494d565b5f6060826040015151603014614a335760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a74988a986001989297929690959094909390929101615c15565b60405160208183030381529060405290505f5b84608001516020015151811015614ae657818560800151602001518281518110614ab357614ab36154a4565b6020026020010151604051602001614acc929190615ccf565b60408051601f198184030181529190529150600101614a87565b5060a0840151805160209182015151604051614b06938593929101615d05565b60405160208183030381529060405290505f5b8460a001516020015151811015614b7857818560a00151602001518281518110614b4557614b456154a4565b6020026020010151604051602001614b5e929190615ccf565b60408051601f198184030181529190529150600101614b19565b5060c0840151604051614b8f918391602001615d40565b6040516020818303038152906040529050600281604051614bb09190615655565b602060405180830381855afa158015614bcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bee919061542d565b94909350915050565b614bff614377565b614c07614d95565b610d3681614d9d565b614c18614377565b6143c0614e85565b614c28614377565b5f80516020615db283398151915261ffff84161580614c4c575061271061ffff8516115b15614c7057604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c945760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614ca75750600a60ff8416115b15614cca5760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d3f83835f614e8d565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613daa565b6143c0614377565b614da5614377565b80355f80516020615dd28339815191529081556014614dca6060840160408501615bbf565b60ff161180614de95750614de46060830160408401615bbf565b60ff16155b15614e1d57614dfe6060830160408401615bbf565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614e2d6060830160408401615bbf565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e5e60408301602084016151ea565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ace614377565b606081471015614eb25760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614ecd9190615655565b5f6040518083038185875af1925050503d805f8114614f07576040519150601f19603f3d011682016040523d82523d5f602084013e614f0c565b606091505b5091509150614f1c868383614f26565b9695505050505050565b606082614f3b57614f3682614f82565b611d3f565b8151158015614f5257506001600160a01b0384163b155b15614f7b57604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d3f565b805115614f925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614fb7906153d5565b5f825580601f10614fc6575050565b601f0160209004905f5260205f2090810190610d36919061501f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615033575f8155600101615020565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114615057575f80fd5b919050565b5f805f6060848603121561506e575f80fd5b83359250602084013561508081615037565b915061508e60408501615044565b90509250925092565b5f602082840312156150a7575f80fd5b5035919050565b5f80604083850312156150bf575f80fd5b82356001600160401b038111156150d4575f80fd5b8301608081860312156150e5575f80fd5b91506150f360208401615044565b90509250929050565b5f806040838503121561510d575f80fd5b823591506150f360208401615044565b5f6020828403121561512d575f80fd5b611d3f82615044565b803561ffff81168114615057575f80fd5b80356001600160401b0381168114615057575f80fd5b5f805f8060808587031215615170575f80fd5b84356001600160401b03811115615185575f80fd5b850160a08188031215615196575f80fd5b93506151a460208601615136565b92506151b260408601615147565b9396929550929360600135925050565b5f80604083850312156151d3575f80fd5b6151dc83615044565b946020939093013593505050565b5f602082840312156151fa575f80fd5b611d3f82615147565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061524757615247615223565b9052565b5f5b8381101561526557818101518382015260200161524d565b50505f910152565b5f815180845261528481602086016020860161524b565b601f01601f19169290920160200192915050565b602081526152aa602082018351615237565b5f602083015160e060408401526152c561010084018261526d565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f8082840361014081121561533f575f80fd5b6101208082121561534e575f80fd5b849350830135905061535f81615318565b809150509250929050565b5f806020838503121561537b575f80fd5b82356001600160401b0380821115615391575f80fd5b818501915085601f8301126153a4575f80fd5b8135818111156153b2575f80fd5b8660208285010111156153c3575f80fd5b60209290920196919550909350505050565b600181811c908216806153e957607f821691505b60208210810361540757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c668284615237565b602081525f611d3f602083018461526d565b5f6020828403121561543d575f80fd5b5051919050565b5f60208284031215615454575f80fd5b8135611d3f81615318565b5f808335601e19843603018112615474575f80fd5b8301803591506001600160401b0382111561548d575f80fd5b6020019150600581901b36038213156136f5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154cc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561550c5761550c6154d6565b60405290565b604080519081016001600160401b038111828210171561550c5761550c6154d6565b604051601f8201601f191681016001600160401b038111828210171561555c5761555c6154d6565b604052919050565b5f6001600160401b0382111561557c5761557c6154d6565b50601f01601f191660200190565b5f82601f830112615599575f80fd5b81356155ac6155a782615564565b615534565b8181528460208386010111156155c0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155ec575f80fd5b6155f46154ea565b82356001600160401b038082111561560a575f80fd5b6156163683870161558a565b8352602085013591508082111561562b575f80fd5b506156383682860161558a565b60208301525061564a60408401615147565b604082015292915050565b5f82516154cc81846020870161524b565b601f8211156104d857805f5260205f20601f840160051c8101602085101561568b5750805b601f840160051c820191505b8181101561166b575f8155600101615697565b81516001600160401b038111156156c3576156c36154d6565b6156d7816156d184546153d5565b84615666565b602080601f83116001811461570a575f84156156f35750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561573857888601518255948401946001909101908401615719565b508582101561575557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c66615765565b5f63ffffffff8083168181036157a4576157a4615765565b6001019392505050565b5f826157c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157e1576157e1615223565b91905290565b8082028115828204841417610c6657610c66615765565b5f60208083525f8454615810816153d5565b806020870152604060018084165f8114615831576001811461584d5761587a565b60ff19851660408a0152604084151560051b8a0101955061587a565b895f5260205f205f5b858110156158715781548b8201860152908301908801615856565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611ea457611ea4615765565b6001600160401b03828116828216039080821115611ea457611ea4615765565b805161505781615037565b5f80604083850312156158f3575f80fd5b82516001600160401b0380821115615909575f80fd5b908401906060828703121561591c575f80fd5b6159246154ea565b8251815260208084015161593781615318565b8282015260408401518381111561594c575f80fd5b80850194505087601f850112615960575f80fd5b835192506159706155a784615564565b8381528882858701011115615983575f80fd5b6159928483830184880161524b565b806040840152508195506159a78188016158d7565b9450505050509250929050565b81810381811115610c6657610c66615765565b5f808335601e198436030181126159dc575f80fd5b8301803591506001600160401b038211156159f5575f80fd5b6020019150368190038213156136f5575f80fd5b5f8851615a1a818460208d0161524b565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615a9557615a95615765565b505092915050565b5f8235603e198336030181126154cc575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615aef575f80fd5b615af7615512565b615b0083615044565b81526020808401356001600160401b0380821115615b1c575f80fd5b9085019036601f830112615b2e575f80fd5b813581811115615b4057615b406154d6565b8060051b9150615b51848301615534565b8181529183018401918481019036841115615b6a575f80fd5b938501935b83851015615b945784359250615b8483615318565b8282529385019390850190615b6f565b94860194909452509295945050505050565b5f60208284031215615bb6575f80fd5b611d3f82615136565b5f60208284031215615bcf575f80fd5b813560ff81168114611d3f575f80fd5b5f6001600160401b038083168181036157a4576157a4615765565b5f60208284031215615c0a575f80fd5b8151611d3f81615037565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615c5b81602a850160208b0161524b565b865190830190615c7281602a840160208b0161524b565b60c087901b6001600160c01b031916602a9290910191820152615ca4603282018660e01b6001600160e01b0319169052565b615cbd603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ce081846020880161524b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615d1681846020890161524b565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615d5181846020880161524b565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161601238038061601283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ec58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b6102096102043660046150e3565b6104a8565b005b61020961021936600461511e565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b3660046150e3565b6106eb565b61020961025e366004615135565b6106f6565b610209610271366004615183565b610c20565b61028961028436600461511e565b610c94565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb3660046150e3565b610caa565b6102096102de3660046151a4565b610cb5565b6102f66102f13660046151e4565b610d77565b604051908152602001610234565b610209610312366004615249565b610dac565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f6610342366004615271565b611017565b61028961035536600461511e565b611030565b6102f65f81565b61020961036f3660046150e3565b611044565b610226603081565b61020961038a36600461511e565b61106f565b61020961039d366004615249565b61113a565b6102f66103b036600461528a565b611312565b6102096103c33660046151a4565b61133e565b6102f65f80516020615e3983398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b61020961041036600461511e565b6114c7565b6102f65f80516020615e5983398151915281565b61020961043736600461511e565b6116b0565b610226601481565b61045761045236600461511e565b6117ed565b604051610234919061531f565b6102896202a30081565b6102f65f80516020615e1983398151915281565b6102096104903660046153b3565b61193c565b6102f66104a33660046153f1565b611a1b565b6104b3838383611a76565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615e998339815191526020526040808220815160e0810190925280545f80516020615e5983398151915293929190829060ff16600581111561052a5761052a6152aa565b600581111561053b5761053b6152aa565b815260200160018201805461054f9061545c565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061545c565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115610631576106316152aa565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615494565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d84565b6040518263ffffffff1660e01b81526004016106a591906154a2565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e591906154b4565b50505050565b6106e5838383611a76565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615e598339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af91906154b4565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e960608501604086016154cb565b6001600160a01b03161461082c5761080760608401604085016154cb565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a60608501856154e6565b905090505f805b828163ffffffff161015610b22575f61085d60608801886154e6565b8363ffffffff168181106108735761087361552b565b9050602002810190610885919061553f565b61088e90615663565b80516040519192505f9160088801916108a6916156dc565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf91906004016154a2565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f916156dc565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d91906154b4565b90508086600801835f015160405161097591906156dc565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f76152aa565b021790555060208201516001820190610a109082615731565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab5911685615800565b8251604051919550610ac6916156dc565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b90615813565b9050610841565b50600483018190556001830154606490610b4690600160401b900460ff1683615835565b1015610b6857604051635943317f60e01b8152600481018290526024016104cf565b5f610b7e610b7586611dd3565b60400151611ee9565b90505f610b8a87612076565b90505f600282604051610b9d91906156dc565b602060405180830381855afa158015610bb8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610bdb91906154b4565b9050828114610c0757604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610c2982612250565b610c49576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c53836117ed565b5190506002816005811115610c6a57610c6a6152aa565b14610c8a578060405163170cc93360e21b81526004016104cf9190615494565b6106e5838361228b565b5f610ca464e8d4a510008361584c565b92915050565b6106e5838383612505565b610cbd6126fe565b5f80516020615e398339815191525f80610cd684612735565b91509150610ce382612250565b610cef57505050610d5e565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610d1e57610d1e6152aa565b03610d43575f83815260078501602052604081208054919055610d418282612a73565b505b610d5981610d548460400151611017565b612ae9565b505050505b610d7460015f80516020615e7983398151915255565b50565b5f610d806126fe565b610d8c85858585612b1f565b9050610da460015f80516020615e7983398151915255565b949350505050565b5f8181525f80516020615df98339815191526020526040808220815160e0810190925280545f80516020615e3983398151915293929190829060ff166003811115610df957610df96152aa565b6003811115610e0a57610e0a6152aa565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e80826117ed565b9050600183516003811115610e9757610e976152aa565b14610eb8578251604051633b0d540d60e21b81526104cf919060040161586b565b600481516005811115610ecd57610ecd6152aa565b03610ee357610edb85612cf8565b505050505050565b5f80610efa610ef189611dd3565b60400151612edf565b5091509150818414610f2757846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f605750806001600160401b03168560a001516001600160401b0316115b15610f8957604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ca46001600160401b03831664e8d4a51000615835565b5f61103a826117ed565b6080015192915050565b61104f838383612505565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615e398339815191525f611087836117ed565b519050600481600581111561109e5761109e6152aa565b146110be578060405163170cc93360e21b81526004016104cf9190615494565b5f8381526004830160205260409020546001600160a01b0316331461110457335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a73565b6111426126fe565b5f8181525f80516020615df98339815191526020526040808220815160e0810190925280545f80516020615e3983398151915293929190829060ff16600381111561118f5761118f6152aa565b60038111156111a0576111a06152aa565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611219576112196152aa565b1461123a578051604051633b0d540d60e21b81526104cf919060040161586b565b600461124982604001516117ed565b51600581111561125b5761125b6152aa565b146112ed575f61126a85611dd3565b90505f8061127b8360400151612edf565b5091509150818460400151146112a75760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112e957604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112f683612cf8565b505061130e60015f80516020615e7983398151915255565b5050565b5f61131b6126fe565b611326833384613135565b9050610ca460015f80516020615e7983398151915255565b5f80516020615e598339815191525f8061136361135a85611dd3565b6040015161340d565b915091508061138957604051632d07135360e01b815281151560048201526024016104cf565b5f828152600684016020526040902080546113a39061545c565b90505f036113c75760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113ed576113ed6152aa565b14611420575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615494565b5f828152600684016020526040812061143891615032565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615df98339815191526020526040808220815160e0810190925280545f80516020615e3983398151915293929190829060ff166003811115611514576115146152aa565b6003811115611525576115256152aa565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561159e5761159e6152aa565b141580156115bf57506003815160038111156115bc576115bc6152aa565b14155b156115e0578051604051633b0d540d60e21b81526104cf919060040161586b565b5f6115ee82604001516117ed565b905080606001516001600160401b03165f03611620576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61164d846040015184606001518560800151611d84565b6040518263ffffffff1660e01b815260040161166991906154a2565b6020604051808303815f875af1158015611685573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a991906154b4565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615e5983398151915291906116f79061545c565b90505f0361171b5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff166005811115611741576117416152aa565b14611774575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615494565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117ad9190600401615885565b6020604051808303815f875af11580156117c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906154b4565b6117f5615069565b5f8281525f80516020615e99833981519152602052604090819020815160e0810190925280545f80516020615e59833981519152929190829060ff166005811115611842576118426152aa565b6005811115611853576118536152aa565b81526020016001820180546118679061545c565b80601f01602080910402602001604051908101604052809291908181526020018280546118939061545c565b80156118de5780601f106118b5576101008083540402835291602001916118de565b820191905f5260205f20905b8154815290600101906020018083116118c157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611985575080546001600160401b03808416911610155b156119a35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119ce84846135c9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615e59833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a5e908690869061590f565b90815260200160405180910390205491505092915050565b5f8381525f80516020615df98339815191526020526040808220815160e0810190925280545f80516020615e398339815191529284929091829060ff166003811115611ac457611ac46152aa565b6003811115611ad557611ad56152aa565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b4b826117ed565b9050600283516003811115611b6257611b626152aa565b14611b83578251604051633b0d540d60e21b81526104cf919060040161586b565b60208301516001600160a01b03163314611c26575f828152600485016020526040902054336001600160a01b0390911603611c20575f82815260048501602052604090205460a0820151611be791600160b01b90046001600160401b03169061591e565b6001600160401b0316421015611c1b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b611c26565b336110df565b600281516005811115611c3b57611c3b6152aa565b03611d18578615611c5257611c50828761228b565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c8b918491611c86919061593e565b6135e3565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ccc8461373a565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d7d9350505050565b600481516005811115611d2d57611d2d6152aa565b03611d6157611d3b8361373a565b5f898152600686016020526040902055611d5488612cf8565b6001945050505050611d7d565b805160405163170cc93360e21b81526104cf9190600401615494565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e37573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e5e9190810190615969565b9150915080611e8057604051636b2f19e960e01b815260040160405180910390fd5b815115611ea6578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611ee2576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611f1e57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f6d57611f35816001615a3b565b611f40906008615835565b61ffff16848281518110611f5657611f5661552b565b016020015160f81c901b9190911790600101611f21565b5061ffff811615611f975760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611ff257611fae816003615a3b565b611fb9906008615835565b63ffffffff1685611fcb836002615800565b81518110611fdb57611fdb61552b565b016020015160f81c901b9190911790600101611f9a565b5063ffffffff81161561201857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561206d5761202f81601f615a3b565b61203a906008615835565b86612046836006615800565b815181106120565761205661552b565b016020015160f81c901b919091179060010161201b565b50949350505050565b60605f80833560208501356014612092878701604089016154cb565b61209f60608901896154e6565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61212560608501856154e6565b9050811015611ee2578161213c60608601866154e6565b8381811061214c5761214c61552b565b905060200281019061215e919061553f565b6121689080615a4e565b905061217760608701876154e6565b848181106121875761218761552b565b9050602002810190612199919061553f565b6121a39080615a4e565b6121b060608901896154e6565b868181106121c0576121c061552b565b90506020028101906121d2919061553f565b6121e0906020810190615a4e565b6121ed60608b018b6154e6565b888181106121fd576121fd61552b565b905060200281019061220f919061553f565b612220906060810190604001615271565b6040516020016122369796959493929190615a90565b60408051601f198184030181529190529150600101612118565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122d6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122fd9190810190615969565b915091508061231f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238691906154b4565b8251146123ac578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123e8576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f806123f784604001516138e6565b9150915081871461241e5760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615e39833981519152906001600160401b0390811690831611156124db575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26124fa565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e398339815191528161251e86613ad7565b905061252986612250565b61253857600192505050611d7d565b5f8681526004830160205260409020546001600160a01b0316331461255d57336110df565b5f86815260048301602052604090205460a082015161258c91600160b01b90046001600160401b03169061591e565b6001600160401b03168160c001516001600160401b031610156125d35760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125eb576125e4878661228b565b9050612609565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061262e90611017565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156126a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c891906154b4565b905080846007015f8a81526020019081526020015f205f8282546126ec9190615800565b90915550501515979650505050505050565b5f80516020615e7983398151915280546001190161272f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61273e615069565b5f80516020615e598339815191525f8061275a61135a87611dd3565b91509150801561278157604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127b2576127b26152aa565b60058111156127c3576127c36152aa565b81526020016001820180546127d79061545c565b80601f01602080910402602001604051908101604052809291908181526020018280546128039061545c565b801561284e5780601f106128255761010080835404028352916020019161284e565b820191905f5260205f20905b81548152906001019060200180831161283157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128b9576128b96152aa565b141580156128da57506001815160058111156128d7576128d76152aa565b14155b156128fb57805160405163170cc93360e21b81526104cf9190600401615494565b600381516005811115612910576129106152aa565b0361291e5760048152612923565b600581525b83600801816020015160405161293991906156dc565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561297d5761297d6152aa565b0217905550602082015160018201906129969082615731565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a3c57612a3c6152aa565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e1983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ace575f80fd5b505af1158015612ae0573d5f803e3d5ffd5b50505050505050565b5f80516020615e198339815191525461130e906001600160a01b03168383613dbb565b60015f80516020615e7983398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e3983398151915290600160401b900461ffff9081169086161080612b73575061271061ffff8616115b15612b9757604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612bd3576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612be55750806001015483115b15612c065760405163222d164360e21b8152600481018490526024016104cf565b5f612c1084613e1a565b90505f612c1c82610c94565b90505f612c298983613e3d565b90506040518060800160405280612c3d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615df98339815191526020526040808220815160e0810190925280545f80516020615e3983398151915293929190829060ff166003811115612d4557612d456152aa565b6003811115612d5657612d566152aa565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e84575f84815260048701602052604090205461271090612e3690600160a01b900461ffff1685615835565b612e40919061584c565b915081866007015f8681526020019081526020015f205f828254612e649190615800565b90915550612e7490508284615a3b565b9050612e84856020015182612a73565b612e998560200151610d548760600151611017565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f1657835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f6557612f2d816001615a3b565b612f38906008615835565b61ffff16868281518110612f4e57612f4e61552b565b016020015160f81c901b9190911790600101612f19565b5061ffff811615612f8f5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612fea57612fa6816003615a3b565b612fb1906008615835565b63ffffffff1687612fc3836002615800565b81518110612fd357612fd361552b565b016020015160f81c901b9190911790600101612f92565b5063ffffffff811660031461301257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130675761302981601f615a3b565b613034906008615835565b88613040836006615800565b815181106130505761305061552b565b016020015160f81c901b9190911790600101613015565b505f805b60088110156130c65761307f816007615a3b565b61308a906008615835565b6001600160401b03168961309f836026615800565b815181106130af576130af61552b565b016020015160f81c901b919091179060010161306b565b505f805b6008811015613125576130de816007615a3b565b6130e9906008615835565b6001600160401b03168a6130fe83602e615800565b8151811061310e5761310e61552b565b016020015160f81c901b91909117906001016130ca565b5091989097509095509350505050565b5f5f80516020615e398339815191528161315161028485613e1a565b90505f61315d876117ed565b905061316887612250565b613188576040516330efa98b60e01b8152600481018890526024016104cf565b60028151600581111561319d5761319d6152aa565b146131be57805160405163170cc93360e21b81526104cf9190600401615494565b5f8282608001516131cf919061591e565b905083600201600a9054906101000a90046001600160401b031682604001516131f89190615af9565b6001600160401b0316816001600160401b0316111561323557604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806132418a846135e3565b915091505f8a8360405160200161326f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613302576133026152aa565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461344357825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156134925761345a816001615a3b565b613465906008615835565b61ffff1685828151811061347b5761347b61552b565b016020015160f81c901b9190911790600101613446565b5061ffff8116156134bc5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613517576134d3816003615a3b565b6134de906008615835565b63ffffffff16866134f0836002615800565b815181106135005761350061552b565b016020015160f81c901b91909117906001016134bf565b5063ffffffff811660021461353f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135945761355681601f615a3b565b613561906008615835565b8761356d836006615800565b8151811061357d5761357d61552b565b016020015160f81c901b9190911790600101613542565b505f866026815181106135a9576135a961552b565b016020015191976001600160f81b03199092161515965090945050505050565b6135d16143b5565b6135da82614400565b61130e8161446e565b5f8281525f80516020615e99833981519152602052604081206002015481905f80516020615e5983398151915290600160801b90046001600160401b031661362b85826144d6565b5f613635876146f9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136858a858b611d84565b6040518263ffffffff1660e01b81526004016136a191906154a2565b6020604051808303815f875af11580156136bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136e191906154b4565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e3983398151915290505f61375a84604001516117ed565b90505f600382516005811115613772576137726152aa565b1480613790575060048251600581111561378e5761378e6152aa565b145b156137a0575060c08101516137dd565b6002825160058111156137b5576137b56152aa565b036137c15750426137dd565b815160405163170cc93360e21b81526104cf9190600401615494565b84608001516001600160401b0316816001600160401b03161161380457505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061382990611017565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156138b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138dd91906154b4565b95945050505050565b5f808251602e1461391c57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b600281101561396b57613933816001615a3b565b61393e906008615835565b61ffff168582815181106139545761395461552b565b016020015160f81c901b919091179060010161391f565b5061ffff8116156139955760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139f0576139ac816003615a3b565b6139b7906008615835565b63ffffffff16866139c9836002615800565b815181106139d9576139d961552b565b016020015160f81c901b9190911790600101613998565b5063ffffffff811615613a1657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a6b57613a2d81601f615a3b565b613a38906008615835565b87613a44836006615800565b81518110613a5457613a5461552b565b016020015160f81c901b9190911790600101613a19565b505f805b6008811015613aca57613a83816007615a3b565b613a8e906008615835565b6001600160401b031688613aa3836026615800565b81518110613ab357613ab361552b565b016020015160f81c901b9190911790600101613a6f565b5090969095509350505050565b613adf615069565b5f8281525f80516020615e998339815191526020526040808220815160e0810190925280545f80516020615e5983398151915293929190829060ff166005811115613b2c57613b2c6152aa565b6005811115613b3d57613b3d6152aa565b8152602001600182018054613b519061545c565b80601f0160208091040260200160405190810160405280929190818152602001828054613b7d9061545c565b8015613bc85780601f10613b9f57610100808354040283529160200191613bc8565b820191905f5260205f20905b815481529060010190602001808311613bab57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c3657613c366152aa565b14613c69575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615494565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cad57613cad6152aa565b021790555060208201516001820190613cc69082615731565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d6485826135e3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061476e565b5f610ca4825f80516020615e19833981519152546001600160a01b0316906147cf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e8157604051637fab81e560e01b815260040160405180910390fd5b5f80516020615e5983398151915242613ea06060860160408701615271565b6001600160401b0316111580613eda5750613ebe6202a30042615800565b613ece6060860160408701615271565b6001600160401b031610155b15613f1457613eef6060850160408601615271565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613f29613f246060860186615b24565b614928565b613f39613f246080860186615b24565b6030613f486020860186615a4e565b905014613f7a57613f5c6020850185615a4e565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f848480615a4e565b90505f03613fb157613f968480615a4e565b604051633e08a12560e11b81526004016104cf929190615b38565b5f60088201613fc08680615a4e565b604051613fce92919061590f565b9081526020016040518091039020541461400757613fec8480615a4e565b60405163a41f772f60e01b81526004016104cf929190615b38565b614011835f6144d6565b6040805160e08101909152815481525f90819061411d90602081016140368980615a4e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061407e908a018a615a4e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140c760608a0160408b01615271565b6001600160401b031681526020016140e260608a018a615b24565b6140eb90615b66565b81526020016140fd60808a018a615b24565b61410690615b66565b8152602001876001600160401b0316815250614a91565b5f8281526006860160205260409020919350915061413b8282615731565b50816008840161414b8880615a4e565b60405161415992919061590f565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141959085906004016154a2565b6020604051808303815f875af11580156141b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d591906154b4565b6040805160e0810190915290915080600181526020016141f58980615a4e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115614284576142846152aa565b02179055506020820151600182019061429d9082615731565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061433b8880615a4e565b60405161434992919061590f565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906143879190615271565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143fe57604051631afcd79f60e31b815260040160405180910390fd5b565b6144086143b5565b61441181614c7e565b614419614c97565b610d746060820135608083013561443660c0850160a08601615271565b61444660e0860160c08701615c2d565b614457610100870160e08801615c46565b614469610120880161010089016154cb565b614ca7565b6144766143b5565b5f80516020615e198339815191526001600160a01b0382166144b657604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615e598339815191525f6001600160401b03808416908516111561450a57614503838561593e565b9050614517565b614514848461593e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614579575060018401548151614575916001600160401b031690615800565b8210155b1561459f576001600160401b0383166060820152818152604081015160208201526145be565b82816060018181516145b1919061591e565b6001600160401b03169052505b60608101516145ce906064615af9565b602082015160018601546001600160401b0392909216916145f99190600160401b900460ff16615835565b101561462957606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516146449190615800565b9052506040810180516001600160401b0387169190614664908390615a3b565b9052506001840154604082015160649161468991600160401b90910460ff1690615835565b10156146b0578060400151604051635943317f60e01b81526004016104cf91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615e998339815191526020526040812060020180545f80516020615e59833981519152919060089061474390600160401b90046001600160401b0316615c66565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147826001600160a01b03841683614dd6565b905080515f141580156147a65750808060200190518101906147a49190615c81565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614815573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061483991906154b4565b90506148506001600160a01b038516333086614de3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148b891906154b4565b905081811161491e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b6138dd8282615a3b565b61493560208201826151a4565b63ffffffff16158015614955575061495060208201826154e6565b151590505b1561499c5761496760208201826151a4565b61497460208301836154e6565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b6149a960208201826154e6565b90506149b860208301836151a4565b63ffffffff1611156149d15761496760208201826151a4565b60015b6149e160208301836154e6565b905081101561130e576149f760208301836154e6565b614a02600184615a3b565b818110614a1157614a1161552b565b9050602002016020810190614a2691906154cb565b6001600160a01b0316614a3c60208401846154e6565b83818110614a4c57614a4c61552b565b9050602002016020810190614a6191906154cb565b6001600160a01b03161015614a8957604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149d4565b5f6060826040015151603014614aba5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614afb988a986001989297929690959094909390929101615c9c565b60405160208183030381529060405290505f5b84608001516020015151811015614b6d57818560800151602001518281518110614b3a57614b3a61552b565b6020026020010151604051602001614b53929190615d56565b60408051601f198184030181529190529150600101614b0e565b5060a0840151805160209182015151604051614b8d938593929101615d8c565b60405160208183030381529060405290505f5b8460a001516020015151811015614bff57818560a00151602001518281518110614bcc57614bcc61552b565b6020026020010151604051602001614be5929190615d56565b60408051601f198184030181529190529150600101614ba0565b5060c0840151604051614c16918391602001615dc7565b6040516020818303038152906040529050600281604051614c3791906156dc565b602060405180830381855afa158015614c52573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c7591906154b4565b94909350915050565b614c866143b5565b614c8e614e1c565b610d7481614e24565b614c9f6143b5565b6143fe614f0c565b614caf6143b5565b5f80516020615e3983398151915261ffff84161580614cd3575061271061ffff8516115b15614cf757604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614d1b5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614d2e5750600a60ff8416115b15614d515760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d7d83835f614f14565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613de8565b6143fe6143b5565b614e2c6143b5565b80355f80516020615e598339815191529081556014614e516060840160408501615c46565b60ff161180614e705750614e6b6060830160408401615c46565b60ff16155b15614ea457614e856060830160408401615c46565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614eb46060830160408401615c46565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614ee56040830160208401615271565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b0c6143b5565b606081471015614f395760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614f5491906156dc565b5f6040518083038185875af1925050503d805f8114614f8e576040519150601f19603f3d011682016040523d82523d5f602084013e614f93565b606091505b5091509150614fa3868383614fad565b9695505050505050565b606082614fc257614fbd82615009565b611d7d565b8151158015614fd957506001600160a01b0384163b155b1561500257604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d7d565b8051156150195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461503e9061545c565b5f825580601f1061504d575050565b601f0160209004905f5260205f2090810190610d7491906150a6565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156150ba575f81556001016150a7565b5090565b8015158114610d74575f80fd5b803563ffffffff811681146150de575f80fd5b919050565b5f805f606084860312156150f5575f80fd5b833592506020840135615107816150be565b9150615115604085016150cb565b90509250925092565b5f6020828403121561512e575f80fd5b5035919050565b5f8060408385031215615146575f80fd5b82356001600160401b0381111561515b575f80fd5b83016080818603121561516c575f80fd5b915061517a602084016150cb565b90509250929050565b5f8060408385031215615194575f80fd5b8235915061517a602084016150cb565b5f602082840312156151b4575f80fd5b611d7d826150cb565b803561ffff811681146150de575f80fd5b80356001600160401b03811681146150de575f80fd5b5f805f80608085870312156151f7575f80fd5b84356001600160401b0381111561520c575f80fd5b850160a0818803121561521d575f80fd5b935061522b602086016151bd565b9250615239604086016151ce565b9396929550929360600135925050565b5f806040838503121561525a575f80fd5b615263836150cb565b946020939093013593505050565b5f60208284031215615281575f80fd5b611d7d826151ce565b5f806040838503121561529b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106152ce576152ce6152aa565b9052565b5f5b838110156152ec5781810151838201526020016152d4565b50505f910152565b5f815180845261530b8160208601602086016152d2565b601f01601f19169290920160200192915050565b602081526153316020820183516152be565b5f602083015160e0604084015261534c6101008401826152f4565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d74575f80fd5b5f808284036101408112156153c6575f80fd5b610120808212156153d5575f80fd5b84935083013590506153e68161539f565b809150509250929050565b5f8060208385031215615402575f80fd5b82356001600160401b0380821115615418575f80fd5b818501915085601f83011261542b575f80fd5b813581811115615439575f80fd5b86602082850101111561544a575f80fd5b60209290920196919550909350505050565b600181811c9082168061547057607f821691505b60208210810361548e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ca482846152be565b602081525f611d7d60208301846152f4565b5f602082840312156154c4575f80fd5b5051919050565b5f602082840312156154db575f80fd5b8135611d7d8161539f565b5f808335601e198436030181126154fb575f80fd5b8301803591506001600160401b03821115615514575f80fd5b6020019150600581901b3603821315613733575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615553575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155935761559361555d565b60405290565b604080519081016001600160401b03811182821017156155935761559361555d565b604051601f8201601f191681016001600160401b03811182821017156155e3576155e361555d565b604052919050565b5f6001600160401b038211156156035761560361555d565b50601f01601f191660200190565b5f82601f830112615620575f80fd5b813561563361562e826155eb565b6155bb565b818152846020838601011115615647575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615673575f80fd5b61567b615571565b82356001600160401b0380821115615691575f80fd5b61569d36838701615611565b835260208501359150808211156156b2575f80fd5b506156bf36828601615611565b6020830152506156d1604084016151ce565b604082015292915050565b5f82516155538184602087016152d2565b601f8211156104d857805f5260205f20601f840160051c810160208510156157125750805b601f840160051c820191505b818110156116a9575f815560010161571e565b81516001600160401b0381111561574a5761574a61555d565b61575e81615758845461545c565b846156ed565b602080601f831160018114615791575f841561577a5750858301515b5f19600386901b1c1916600185901b178555610edb565b5f85815260208120601f198616915b828110156157bf578886015182559484019460019091019084016157a0565b50858210156157dc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ca457610ca46157ec565b5f63ffffffff80831681810361582b5761582b6157ec565b6001019392505050565b8082028115828204841417610ca457610ca46157ec565b5f8261586657634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061587f5761587f6152aa565b91905290565b5f60208083525f84546158978161545c565b806020870152604060018084165f81146158b857600181146158d457615901565b60ff19851660408a0152604084151560051b8a01019550615901565b895f5260205f205f5b858110156158f85781548b82018601529083019088016158dd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611ee257611ee26157ec565b6001600160401b03828116828216039080821115611ee257611ee26157ec565b80516150de816150be565b5f806040838503121561597a575f80fd5b82516001600160401b0380821115615990575f80fd5b90840190606082870312156159a3575f80fd5b6159ab615571565b825181526020808401516159be8161539f565b828201526040840151838111156159d3575f80fd5b80850194505087601f8501126159e7575f80fd5b835192506159f761562e846155eb565b8381528882858701011115615a0a575f80fd5b615a19848383018488016152d2565b80604084015250819550615a2e81880161595e565b9450505050509250929050565b81810381811115610ca457610ca46157ec565b5f808335601e19843603018112615a63575f80fd5b8301803591506001600160401b03821115615a7c575f80fd5b602001915036819003821315613733575f80fd5b5f8851615aa1818460208d016152d2565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b1c57615b1c6157ec565b505092915050565b5f8235603e19833603018112615553575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615b76575f80fd5b615b7e615599565b615b87836150cb565b81526020808401356001600160401b0380821115615ba3575f80fd5b9085019036601f830112615bb5575f80fd5b813581811115615bc757615bc761555d565b8060051b9150615bd88483016155bb565b8181529183018401918481019036841115615bf1575f80fd5b938501935b83851015615c1b5784359250615c0b8361539f565b8282529385019390850190615bf6565b94860194909452509295945050505050565b5f60208284031215615c3d575f80fd5b611d7d826151bd565b5f60208284031215615c56575f80fd5b813560ff81168114611d7d575f80fd5b5f6001600160401b0380831681810361582b5761582b6157ec565b5f60208284031215615c91575f80fd5b8151611d7d816150be565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615ce281602a850160208b016152d2565b865190830190615cf981602a840160208b016152d2565b60c087901b6001600160c01b031916602a9290910191820152615d2b603282018660e01b6001600160e01b0319169052565b615d44603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615d678184602088016152d2565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615d9d8184602089016152d2565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615dd88184602088016152d2565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 9bff585a9..976bb688e 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -90,8 +90,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615c96380380615c9683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b498061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614e00565b61060a565b005b348015610216575f80fd5b50610209610225366004614e3b565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614e00565b61084d565b34801561027f575f80fd5b5061020961028e366004614e52565b610858565b34801561029e575f80fd5b506102096102ad366004614ea0565b610d44565b3480156102bd575f80fd5b506102096102cc366004614eb7565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614e3b565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614e00565b610eab565b34801561038c575f80fd5b5061020961039b366004614ed8565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614ef1565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614f2f565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614e3b565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614e00565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614e3b565b61123b565b3480156104a4575f80fd5b506102096104b3366004614ef1565b611306565b3480156104c3575f80fd5b506102096104d2366004614ed8565b6114de565b6104076104e5366004614f59565b611667565b3480156104f5575f80fd5b506104075f80516020615abd83398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614e3b565b61169b565b34801561054e575f80fd5b506104075f80516020615add83398151915281565b34801561056e575f80fd5b5061020961057d366004614e3b565b611884565b610407610590366004614e3b565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614e3b565b6119f2565b60405161024c9190615022565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b506104076106053660046150a2565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff16600581111561068c5761068c614fad565b600581111561069d5761069d614fad565b81526020016001820180546106b19061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061510d565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614fad565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611ea3565b6040518263ffffffff1660e01b8152600401610807919061514d565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610847919061515f565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615add8339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610911919061515f565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161518a565b6001600160a01b03161461098e57610969606084016040850161518a565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c60608501856151a5565b905090505f805b828163ffffffff161015610c84575f6109bf60608801886151a5565b8363ffffffff168181106109d5576109d56151ea565b90506020028101906109e791906151fe565b6109f090615322565b80516040519192505f916008880191610a089161539b565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b8152610631919060040161514d565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a819161539b565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf919061515f565b90508086600801835f0151604051610ad7919061539b565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614fad565b021790555060208201516001820190610b7290826153f0565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c179116856154bf565b8251604051919550610c289161539b565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d906154d2565b90506109a3565b50600483018190555f610ca2610c9986611ef2565b60400151612008565b90505f610cae87612195565b90505f600282604051610cc1919061539b565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff919061515f565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd58361236f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a82612380565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614fad565b14610e8b578060405163170cc93360e21b8152600401610631919061513f565b61084783836123bb565b5f610ea564e8d4a51000836154f4565b92915050565b610847838383612635565b610ebe61282e565b5f80516020615abd8339815191525f80610ed784612865565b91509150610ee482612380565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614fad565b03610f44575f83815260078501602052604081208054919055610f428282612ba3565b505b610f5a81610f5584604001516111e3565b612c01565b505050505b610f7560015f80516020615afd83398151915255565b50565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115610fc557610fc5614fad565b6003811115610fd657610fd6614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614fad565b14611084578251604051633b0d540d60e21b81526106319190600401615513565b60048151600581111561109957611099614fad565b036110af576110a785612c27565b505050505050565b5f806110c66110bd89611ef2565b60400151612e0e565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a5100061552d565b5f611206826119f2565b6080015192915050565b61121b838383612635565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615abd8339815191525f611253836119f2565b519050600481600581111561126a5761126a614fad565b1461128a578060405163170cc93360e21b8152600401610631919061513f565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612ba3565b61130e61282e565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff16600381111561135b5761135b614fad565b600381111561136c5761136c614fad565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614fad565b14611406578051604051633b0d540d60e21b81526106319190600401615513565b600461141582604001516119f2565b51600581111561142757611427614fad565b146114b9575f61143685611ef2565b90505f806114478360400151612e0e565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c27565b50506114da60015f80516020615afd83398151915255565b5050565b5f80516020615add8339815191525f806115036114fa85611ef2565b60400151613064565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f828152600684016020526040902080546115439061510d565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614fad565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068401602052604081206115d891614d54565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61167061282e565b61167c84848434613220565b905061169460015f80516020615afd83398151915255565b9392505050565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff1660038111156116e8576116e8614fad565b60038111156116f9576116f9614fad565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614fad565b14158015611793575060038151600381111561179057611790614fad565b14155b156117b4578051604051633b0d540d60e21b81526106319190600401615513565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611ea3565b6040518263ffffffff1660e01b815260040161183d919061514d565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d919061515f565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615add83398151915291906118cb9061510d565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614fad565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119819190600401615544565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a919061515f565b5f6119ca61282e565b6119d58233346133ee565b90506119ed60015f80516020615afd83398151915255565b919050565b6119fa614d8b565b5f8281525f80516020615b1d833981519152602052604090819020815160e0810190925280545f80516020615add833981519152929190829060ff166005811115611a4757611a47614fad565b6005811115611a5857611a58614fad565b8152602001600182018054611a6c9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a989061510d565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615add833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8490869086906155ce565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd8339815191529284929091829060ff166003811115611bea57611bea614fad565b6003811115611bfb57611bfb614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614fad565b14611ca9578251604051633b0d540d60e21b81526106319190600401615513565b60208301516001600160a01b03163314611d4c575f828152600485016020526040902054336001600160a01b0390911603611d46575f82815260048501602052604090205460a0820151611d0d91600160b01b90046001600160401b0316906155dd565b6001600160401b0316421015611d415760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b611d4c565b336112ab565b600281516005811115611d6157611d61614fad565b03611e3e578615611d7857611d7682876123bb565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611db1918491611dac91906155fd565b6136c3565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611df28461381a565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e5357611e53614fad565b03611e8757611e618361381a565b5f898152600686016020526040902055611e7a88612c27565b6001945050505050611694565b805160405163170cc93360e21b8152610631919060040161513f565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f56573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7d9190810190615628565b9150915080611f9f57604051636b2f19e960e01b815260040160405180910390fd5b815115611fc5578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612001576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461203d57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561208c576120548160016156fa565b61205f90600861552d565b61ffff16848281518110612075576120756151ea565b016020015160f81c901b9190911790600101612040565b5061ffff8116156120b65760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612111576120cd8160036156fa565b6120d890600861552d565b63ffffffff16856120ea8360026154bf565b815181106120fa576120fa6151ea565b016020015160f81c901b91909117906001016120b9565b5063ffffffff81161561213757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561218c5761214e81601f6156fa565b61215990600861552d565b866121658360066154bf565b81518110612175576121756151ea565b016020015160f81c901b919091179060010161213a565b50949350505050565b60605f808335602085013560146121b18787016040890161518a565b6121be60608901896151a5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61224460608501856151a5565b9050811015612001578161225b60608601866151a5565b8381811061226b5761226b6151ea565b905060200281019061227d91906151fe565b612287908061570d565b905061229660608701876151a5565b848181106122a6576122a66151ea565b90506020028101906122b891906151fe565b6122c2908061570d565b6122cf60608901896151a5565b868181106122df576122df6151ea565b90506020028101906122f191906151fe565b6122ff90602081019061570d565b61230c60608b018b6151a5565b8881811061231c5761231c6151ea565b905060200281019061232e91906151fe565b61233f906060810190604001614f2f565b604051602001612355979695949392919061574f565b60408051601f198184030181529190529150600101612237565b6123776139c6565b610f7581613a11565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612406573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261242d9190810190615628565b915091508061244f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b6919061515f565b8251146124dc578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612518576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125278460400151613a7f565b9150915081871461254e5760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615abd833981519152906001600160401b03908116908316111561260b575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261262a565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615abd8339815191528161264e86613c70565b905061265986612380565b61266857600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461268d57336112ab565b5f86815260048301602052604090205460a08201516126bc91600160b01b90046001600160401b0316906155dd565b6001600160401b03168160c001516001600160401b031610156127035760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f851561271b5761271487866123bb565b9050612739565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061275e906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156127d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f8919061515f565b905080846007015f8a81526020019081526020015f205f82825461281c91906154bf565b90915550501515979650505050505050565b5f80516020615afd83398151915280546001190161285f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61286e614d8b565b5f80516020615add8339815191525f8061288a6114fa87611ef2565b9150915080156128b157604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128e2576128e2614fad565b60058111156128f3576128f3614fad565b81526020016001820180546129079061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546129339061510d565b801561297e5780601f106129555761010080835404028352916020019161297e565b820191905f5260205f20905b81548152906001019060200180831161296157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129e9576129e9614fad565b14158015612a0a5750600181516005811115612a0757612a07614fad565b14155b15612a2b57805160405163170cc93360e21b8152610631919060040161513f565b600381516005811115612a4057612a40614fad565b03612a4e5760048152612a53565b600581525b836008018160200151604051612a69919061539b565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aad57612aad614fad565b021790555060208201516001820190612ac690826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b6c57612b6c614fad565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612bef575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f54565b60015f80516020615afd83398151915255565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115612c7457612c74614fad565b6003811115612c8557612c85614fad565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612db3575f84815260048701602052604090205461271090612d6590600160a01b900461ffff168561552d565b612d6f91906154f4565b915081866007015f8681526020019081526020015f205f828254612d9391906154bf565b90915550612da3905082846156fa565b9050612db3856020015182612ba3565b612dc88560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4557835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e9457612e5c8160016156fa565b612e6790600861552d565b61ffff16868281518110612e7d57612e7d6151ea565b016020015160f81c901b9190911790600101612e48565b5061ffff811615612ebe5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f1957612ed58160036156fa565b612ee090600861552d565b63ffffffff1687612ef28360026154bf565b81518110612f0257612f026151ea565b016020015160f81c901b9190911790600101612ec1565b5063ffffffff8116600314612f4157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f9657612f5881601f6156fa565b612f6390600861552d565b88612f6f8360066154bf565b81518110612f7f57612f7f6151ea565b016020015160f81c901b9190911790600101612f44565b505f805b6008811015612ff557612fae8160076156fa565b612fb990600861552d565b6001600160401b031689612fce8360266154bf565b81518110612fde57612fde6151ea565b016020015160f81c901b9190911790600101612f9a565b505f805b60088110156130545761300d8160076156fa565b61301890600861552d565b6001600160401b03168a61302d83602e6154bf565b8151811061303d5761303d6151ea565b016020015160f81c901b9190911790600101612ff9565b5091989097509095509350505050565b5f80825160271461309a57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b60028110156130e9576130b18160016156fa565b6130bc90600861552d565b61ffff168582815181106130d2576130d26151ea565b016020015160f81c901b919091179060010161309d565b5061ffff8116156131135760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561316e5761312a8160036156fa565b61313590600861552d565b63ffffffff16866131478360026154bf565b81518110613157576131576151ea565b016020015160f81c901b9190911790600101613116565b5063ffffffff811660021461319657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131eb576131ad81601f6156fa565b6131b890600861552d565b876131c48360066154bf565b815181106131d4576131d46151ea565b016020015160f81c901b9190911790600101613199565b505f86602681518110613200576132006151ea565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615abd83398151915290600160401b900461ffff9081169086161080613274575061271061ffff8616115b1561329857604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b0390811690851610156132d4576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806132e65750806001015483115b156133075760405163222d164360e21b815260048101849052602401610631565b825f61331282610e95565b90505f61331f8983613fe7565b905060405180608001604052806133333390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615abd8339815191528161340784610e95565b90505f613413876119f2565b905061341e87612380565b61343e576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561345357613453614fad565b1461347457805160405163170cc93360e21b8152610631919060040161513f565b5f82826080015161348591906155dd565b905083600201600a9054906101000a90046001600160401b031682604001516134ae91906157b8565b6001600160401b0316816001600160401b031611156134eb57604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806134f78a846136c3565b915091505f8a8360405160200161352592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135b8576135b8614fad565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615b1d833981519152602052604081206002015481905f80516020615add83398151915290600160801b90046001600160401b031661370b858261455f565b5f61371587614739565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137658a858b611ea3565b6040518263ffffffff1660e01b8152600401613781919061514d565b6020604051808303815f875af115801561379d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c1919061515f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615abd83398151915290505f61383a84604001516119f2565b90505f60038251600581111561385257613852614fad565b1480613870575060048251600581111561386e5761386e614fad565b145b15613880575060c08101516138bd565b60028251600581111561389557613895614fad565b036138a15750426138bd565b815160405163170cc93360e21b8152610631919060040161513f565b84608001516001600160401b0316816001600160401b0316116138e457505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613909906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139bd919061515f565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a0f57604051631afcd79f60e31b815260040160405180910390fd5b565b613a196139c6565b613a22816147ae565b613a2a6147c7565b610f7560608201356080830135613a4760c0850160a08601614f2f565b613a5760e0860160c087016157e3565b613a68610100870160e088016157fc565b613a7a6101208801610100890161518a565b6147d7565b5f808251602e14613ab557825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b0457613acc8160016156fa565b613ad790600861552d565b61ffff16858281518110613aed57613aed6151ea565b016020015160f81c901b9190911790600101613ab8565b5061ffff811615613b2e5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b8957613b458160036156fa565b613b5090600861552d565b63ffffffff1686613b628360026154bf565b81518110613b7257613b726151ea565b016020015160f81c901b9190911790600101613b31565b5063ffffffff811615613baf57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c0457613bc681601f6156fa565b613bd190600861552d565b87613bdd8360066154bf565b81518110613bed57613bed6151ea565b016020015160f81c901b9190911790600101613bb2565b505f805b6008811015613c6357613c1c8160076156fa565b613c2790600861552d565b6001600160401b031688613c3c8360266154bf565b81518110613c4c57613c4c6151ea565b016020015160f81c901b9190911790600101613c08565b5090969095509350505050565b613c78614d8b565b5f8281525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff166005811115613cc557613cc5614fad565b6005811115613cd657613cd6614fad565b8152602001600182018054613cea9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054613d169061510d565b8015613d615780601f10613d3857610100808354040283529160200191613d61565b820191905f5260205f20905b815481529060010190602001808311613d4457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dcf57613dcf614fad565b14613e02575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e4657613e46614fad565b021790555060208201516001820190613e5f90826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613efd85826136c3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f775760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fc0576040519150601f19603f3d011682016040523d82523d5f602084013e613fc5565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661402b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615add8339815191524261404a6060860160408701614f2f565b6001600160401b031611158061408457506140686202a300426154bf565b6140786060860160408701614f2f565b6001600160401b031610155b156140be576140996060850160408601614f2f565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b6140d36140ce606086018661581c565b614906565b6140e36140ce608086018661581c565b60306140f2602086018661570d565b90501461412457614106602085018561570d565b6040516326475b2f60e11b8152610631925060040190815260200190565b61412e848061570d565b90505f0361415b57614140848061570d565b604051633e08a12560e11b8152600401610631929190615830565b5f6008820161416a868061570d565b6040516141789291906155ce565b908152602001604051809103902054146141b157614196848061570d565b60405163a41f772f60e01b8152600401610631929190615830565b6141bb835f61455f565b6040805160e08101909152815481525f9081906142c790602081016141e0898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614228908a018a61570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161427160608a0160408b01614f2f565b6001600160401b0316815260200161428c60608a018a61581c565b6142959061585e565b81526020016142a760808a018a61581c565b6142b09061585e565b8152602001876001600160401b0316815250614a6f565b5f828152600686016020526040902091935091506142e582826153f0565b5081600884016142f5888061570d565b6040516143039291906155ce565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061433f90859060040161514d565b6020604051808303815f875af115801561435b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437f919061515f565b6040805160e08101909152909150806001815260200161439f898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561442e5761442e614fad565b02179055506020820151600182019061444790826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144e5888061570d565b6040516144f39291906155ce565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145319190614f2f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615add8339815191525f6001600160401b0380841690851611156145935761458c83856155fd565b90506145a0565b61459d84846155fd565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146025750600184015481516145fe916001600160401b0316906154bf565b8210155b15614628576001600160401b038316606082015281815260408101516020820152614647565b828160600181815161463a91906155dd565b6001600160401b03169052505b60608101516146579060646157b8565b602082015160018601546001600160401b0392909216916146829190600160401b900460ff1661552d565b10156146b257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146cd91906154bf565b9052506040810180516001600160401b03871691906146ed9083906156fa565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615b1d8339815191526020526040812060020180545f80516020615add833981519152919060089061478390600160401b90046001600160401b0316615925565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147b66139c6565b6147be614c5c565b610f7581614c64565b6147cf6139c6565b613a0f614d4c565b6147df6139c6565b5f80516020615abd83398151915261ffff84161580614803575061271061ffff8516115b1561482757604051635f12e6c360e11b815261ffff85166004820152602401610631565b8587111561484b5760405163222d164360e21b815260048101889052602401610631565b60ff8316158061485e5750600a60ff8416115b156148815760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6149136020820182614ed8565b63ffffffff16158015614933575061492e60208201826151a5565b151590505b1561497a576149456020820182614ed8565b61495260208301836151a5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b61498760208201826151a5565b90506149966020830183614ed8565b63ffffffff1611156149af576149456020820182614ed8565b60015b6149bf60208301836151a5565b90508110156114da576149d560208301836151a5565b6149e06001846156fa565b8181106149ef576149ef6151ea565b9050602002016020810190614a04919061518a565b6001600160a01b0316614a1a60208401846151a5565b83818110614a2a57614a2a6151ea565b9050602002016020810190614a3f919061518a565b6001600160a01b03161015614a6757604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149b2565b5f6060826040015151603014614a985760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614ad9988a986001989297929690959094909390929101615940565b60405160208183030381529060405290505f5b84608001516020015151811015614b4b57818560800151602001518281518110614b1857614b186151ea565b6020026020010151604051602001614b319291906159fa565b60408051601f198184030181529190529150600101614aec565b5060a0840151805160209182015151604051614b6b938593929101615a30565b60405160208183030381529060405290505f5b8460a001516020015151811015614bdd57818560a00151602001518281518110614baa57614baa6151ea565b6020026020010151604051602001614bc39291906159fa565b60408051601f198184030181529190529150600101614b7e565b5060c0840151604051614bf4918391602001615a6b565b6040516020818303038152906040529050600281604051614c15919061539b565b602060405180830381855afa158015614c30573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c53919061515f565b94909350915050565b613a0f6139c6565b614c6c6139c6565b80355f80516020615add8339815191529081556014614c9160608401604085016157fc565b60ff161180614cb05750614cab60608301604084016157fc565b60ff16155b15614ce457614cc560608301604084016157fc565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614cf460608301604084016157fc565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d256040830160208401614f2f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c146139c6565b508054614d609061510d565b5f825580601f10614d6f575050565b601f0160209004905f5260205f2090810190610f759190614dc8565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ddc575f8155600101614dc9565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614e12575f80fd5b833592506020840135614e2481614de0565b9150614e3260408501614ded565b90509250925092565b5f60208284031215614e4b575f80fd5b5035919050565b5f8060408385031215614e63575f80fd5b82356001600160401b03811115614e78575f80fd5b830160808186031215614e89575f80fd5b9150614e9760208401614ded565b90509250929050565b5f6101208284031215614eb1575f80fd5b50919050565b5f8060408385031215614ec8575f80fd5b82359150614e9760208401614ded565b5f60208284031215614ee8575f80fd5b61169482614ded565b5f8060408385031215614f02575f80fd5b614f0b83614ded565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614f3f575f80fd5b61169482614f19565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614f6b575f80fd5b83356001600160401b03811115614f80575f80fd5b840160a08187031215614f91575f80fd5b9250614f9f60208501614f48565b9150614e3260408501614f19565b634e487b7160e01b5f52602160045260245ffd5b60068110614fd157614fd1614fad565b9052565b5f5b83811015614fef578181015183820152602001614fd7565b50505f910152565b5f815180845261500e816020860160208601614fd5565b601f01601f19169290920160200192915050565b60208152615034602082018351614fc1565b5f602083015160e0604084015261504f610100840182614ff7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150b3575f80fd5b82356001600160401b03808211156150c9575f80fd5b818501915085601f8301126150dc575f80fd5b8135818111156150ea575f80fd5b8660208285010111156150fb575f80fd5b60209290920196919550909350505050565b600181811c9082168061512157607f821691505b602082108103614eb157634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614fc1565b602081525f6116946020830184614ff7565b5f6020828403121561516f575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561519a575f80fd5b813561169481615176565b5f808335601e198436030181126151ba575f80fd5b8301803591506001600160401b038211156151d3575f80fd5b6020019150600581901b3603821315613813575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615212575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152525761525261521c565b60405290565b604080519081016001600160401b03811182821017156152525761525261521c565b604051601f8201601f191681016001600160401b03811182821017156152a2576152a261521c565b604052919050565b5f6001600160401b038211156152c2576152c261521c565b50601f01601f191660200190565b5f82601f8301126152df575f80fd5b81356152f26152ed826152aa565b61527a565b818152846020838601011115615306575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615332575f80fd5b61533a615230565b82356001600160401b0380821115615350575f80fd5b61535c368387016152d0565b83526020850135915080821115615371575f80fd5b5061537e368286016152d0565b60208301525061539060408401614f19565b604082015292915050565b5f8251615212818460208701614fd5565b601f82111561063a57805f5260205f20601f840160051c810160208510156153d15750805b601f840160051c820191505b8181101561187d575f81556001016153dd565b81516001600160401b038111156154095761540961521c565b61541d81615417845461510d565b846153ac565b602080601f831160018114615450575f84156154395750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561547e5788860151825594840194600190910190840161545f565b508582101561549b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea56154ab565b5f63ffffffff8083168181036154ea576154ea6154ab565b6001019392505050565b5f8261550e57634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061552757615527614fad565b91905290565b8082028115828204841417610ea557610ea56154ab565b5f60208083525f84546155568161510d565b806020870152604060018084165f81146155775760018114615593576155c0565b60ff19851660408a0152604084151560051b8a010195506155c0565b895f5260205f205f5b858110156155b75781548b820186015290830190880161559c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115612001576120016154ab565b6001600160401b03828116828216039080821115612001576120016154ab565b80516119ed81614de0565b5f8060408385031215615639575f80fd5b82516001600160401b038082111561564f575f80fd5b9084019060608287031215615662575f80fd5b61566a615230565b8251815260208084015161567d81615176565b82820152604084015183811115615692575f80fd5b80850194505087601f8501126156a6575f80fd5b835192506156b66152ed846152aa565b83815288828587010111156156c9575f80fd5b6156d884838301848801614fd5565b806040840152508195506156ed81880161561d565b9450505050509250929050565b81810381811115610ea557610ea56154ab565b5f808335601e19843603018112615722575f80fd5b8301803591506001600160401b0382111561573b575f80fd5b602001915036819003821315613813575f80fd5b5f8851615760818460208d01614fd5565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146157db576157db6154ab565b505092915050565b5f602082840312156157f3575f80fd5b61169482614f48565b5f6020828403121561580c575f80fd5b813560ff81168114611694575f80fd5b5f8235603e19833603018112615212575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6040823603121561586e575f80fd5b615876615258565b61587f83614ded565b81526020808401356001600160401b038082111561589b575f80fd5b9085019036601f8301126158ad575f80fd5b8135818111156158bf576158bf61521c565b8060051b91506158d084830161527a565b81815291830184019184810190368411156158e9575f80fd5b938501935b83851015615913578435925061590383615176565b82825293850193908501906158ee565b94860194909452509295945050505050565b5f6001600160401b038083168181036154ea576154ea6154ab565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161598681602a850160208b01614fd5565b86519083019061599d81602a840160208b01614fd5565b60c087901b6001600160c01b031916602a92909101918201526159cf603282018660e01b6001600160e01b0319169052565b6159e8603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a0b818460208801614fd5565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615a41818460208901614fd5565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615a7c818460208801614fd5565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615d1d380380615d1d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615bd08061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614e87565b61060a565b005b348015610216575f80fd5b50610209610225366004614ec2565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614e87565b61084d565b34801561027f575f80fd5b5061020961028e366004614ed9565b610858565b34801561029e575f80fd5b506102096102ad366004614f27565b610d82565b3480156102bd575f80fd5b506102096102cc366004614f3e565b610e5f565b3480156102dc575f80fd5b506102f06102eb366004614ec2565b610ed3565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614e87565b610ee9565b34801561038c575f80fd5b5061020961039b366004614f5f565b610ef4565b3480156103ab575f80fd5b506102096103ba366004614f78565b610fb6565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614fb6565b611221565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614ec2565b61123a565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614e87565b61124e565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614ec2565b611279565b3480156104a4575f80fd5b506102096104b3366004614f78565b611344565b3480156104c3575f80fd5b506102096104d2366004614f5f565b61151c565b6104076104e5366004614fe0565b6116a5565b3480156104f5575f80fd5b506104075f80516020615b4483398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614ec2565b6116d9565b34801561054e575f80fd5b506104075f80516020615b6483398151915281565b34801561056e575f80fd5b5061020961057d366004614ec2565b6118c2565b610407610590366004614ec2565b6119ff565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614ec2565b611a30565b60405161024c91906150a9565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004615129565b611b7f565b610615838383611bda565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615ba48339815191526020526040808220815160e0810190925280545f80516020615b6483398151915293929190829060ff16600581111561068c5761068c615034565b600581111561069d5761069d615034565b81526020016001820180546106b190615194565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90615194565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793615034565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016151c6565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611ee1565b6040518263ffffffff1660e01b815260040161080791906151d4565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084791906151e6565b50505050565b610847838383611bda565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615b648339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091191906151e6565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b6060850160408601615211565b6001600160a01b03161461098e576109696060840160408501615211565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c606085018561522c565b905090505f805b828163ffffffff161015610c84575f6109bf606088018861522c565b8363ffffffff168181106109d5576109d5615271565b90506020028101906109e79190615285565b6109f0906153a9565b80516040519192505f916008880191610a0891615422565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b815261063191906004016151d4565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8191615422565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf91906151e6565b90508086600801835f0151604051610ad79190615422565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59615034565b021790555060208201516001820190610b729082615477565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615546565b8251604051919550610c2891615422565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d90615559565b90506109a3565b50600483018190556001830154606490610ca890600160401b900460ff168361557b565b1015610cca57604051635943317f60e01b815260048101829052602401610631565b5f610ce0610cd786611f30565b60400151612046565b90505f610cec876121d3565b90505f600282604051610cff9190615422565b602060405180830381855afa158015610d1a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d3d91906151e6565b9050828114610d6957604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610dcb575080546001600160401b03808416911610155b15610de95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610e13836123ad565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e68826123be565b610e88576040516330efa98b60e01b815260048101839052602401610631565b5f610e9283611a30565b5190506002816005811115610ea957610ea9615034565b14610ec9578060405163170cc93360e21b815260040161063191906151c6565b61084783836123f9565b5f610ee364e8d4a5100083615592565b92915050565b610847838383612673565b610efc61286c565b5f80516020615b448339815191525f80610f15846128a3565b91509150610f22826123be565b610f2e57505050610f9d565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f5d57610f5d615034565b03610f82575f83815260078501602052604081208054919055610f808282612be1565b505b610f9881610f938460400151611221565b612c3f565b505050505b610fb360015f80516020615b8483398151915255565b50565b5f8181525f80516020615b248339815191526020526040808220815160e0810190925280545f80516020615b4483398151915293929190829060ff16600381111561100357611003615034565b600381111561101457611014615034565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61108a82611a30565b90506001835160038111156110a1576110a1615034565b146110c2578251604051633b0d540d60e21b815261063191906004016155b1565b6004815160058111156110d7576110d7615034565b036110ed576110e585612c65565b505050505050565b5f806111046110fb89611f30565b60400151612e4c565b509150915081841461113157846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061116a5750806001600160401b03168560a001516001600160401b0316115b1561119357604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ee36001600160401b03831664e8d4a5100061557b565b5f61124482611a30565b6080015192915050565b611259838383612673565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615b448339815191525f61129183611a30565b51905060048160058111156112a8576112a8615034565b146112c8578060405163170cc93360e21b815260040161063191906151c6565b5f8381526004830160205260409020546001600160a01b0316331461130e57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612be1565b61134c61286c565b5f8181525f80516020615b248339815191526020526040808220815160e0810190925280545f80516020615b4483398151915293929190829060ff16600381111561139957611399615034565b60038111156113aa576113aa615034565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561142357611423615034565b14611444578051604051633b0d540d60e21b815261063191906004016155b1565b60046114538260400151611a30565b51600581111561146557611465615034565b146114f7575f61147485611f30565b90505f806114858360400151612e4c565b5091509150818460400151146114b15760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114f357604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b61150083612c65565b505061151860015f80516020615b8483398151915255565b5050565b5f80516020615b648339815191525f8061154161153885611f30565b604001516130a2565b915091508061156757604051632d07135360e01b81528115156004820152602401610631565b5f8281526006840160205260409020805461158190615194565b90505f036115a55760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff1660058111156115cb576115cb615034565b146115fe575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff16906004016151c6565b5f828152600684016020526040812061161691614ddb565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116ae61286c565b6116ba8484843461325e565b90506116d260015f80516020615b8483398151915255565b9392505050565b5f8181525f80516020615b248339815191526020526040808220815160e0810190925280545f80516020615b4483398151915293929190829060ff16600381111561172657611726615034565b600381111561173757611737615034565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117b0576117b0615034565b141580156117d157506003815160038111156117ce576117ce615034565b14155b156117f2578051604051633b0d540d60e21b815261063191906004016155b1565b5f6118008260400151611a30565b905080606001516001600160401b03165f03611832576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb61185f846040015184606001518560800151611ee1565b6040518263ffffffff1660e01b815260040161187b91906151d4565b6020604051808303815f875af1158015611897573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118bb91906151e6565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615b64833981519152919061190990615194565b90505f0361192d5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561195357611953615034565b14611986575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff16906004016151c6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119bf91906004016155cb565b6020604051808303815f875af11580156119db573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a91906151e6565b5f611a0861286c565b611a1382333461342c565b9050611a2b60015f80516020615b8483398151915255565b919050565b611a38614e12565b5f8281525f80516020615ba4833981519152602052604090819020815160e0810190925280545f80516020615b64833981519152929190829060ff166005811115611a8557611a85615034565b6005811115611a9657611a96615034565b8152602001600182018054611aaa90615194565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad690615194565b8015611b215780601f10611af857610100808354040283529160200191611b21565b820191905f5260205f20905b815481529060010190602001808311611b0457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615b64833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611bc29086908690615655565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b248339815191526020526040808220815160e0810190925280545f80516020615b448339815191529284929091829060ff166003811115611c2857611c28615034565b6003811115611c3957611c39615034565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611caf82611a30565b9050600283516003811115611cc657611cc6615034565b14611ce7578251604051633b0d540d60e21b815261063191906004016155b1565b60208301516001600160a01b03163314611d8a575f828152600485016020526040902054336001600160a01b0390911603611d84575f82815260048501602052604090205460a0820151611d4b91600160b01b90046001600160401b031690615664565b6001600160401b0316421015611d7f5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b611d8a565b336112e9565b600281516005811115611d9f57611d9f615034565b03611e7c578615611db657611db482876123f9565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611def918491611dea9190615684565b613701565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e3084613858565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116d29350505050565b600481516005811115611e9157611e91615034565b03611ec557611e9f83613858565b5f898152600686016020526040902055611eb888612c65565b60019450505050506116d2565b805160405163170cc93360e21b815261063191906004016151c6565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f94573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fbb91908101906156af565b9150915080611fdd57604051636b2f19e960e01b815260040160405180910390fd5b815115612003578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561203f576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461207b57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b60028110156120ca57612092816001615781565b61209d90600861557b565b61ffff168482815181106120b3576120b3615271565b016020015160f81c901b919091179060010161207e565b5061ffff8116156120f45760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561214f5761210b816003615781565b61211690600861557b565b63ffffffff1685612128836002615546565b8151811061213857612138615271565b016020015160f81c901b91909117906001016120f7565b5063ffffffff81161561217557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121ca5761218c81601f615781565b61219790600861557b565b866121a3836006615546565b815181106121b3576121b3615271565b016020015160f81c901b9190911790600101612178565b50949350505050565b60605f808335602085013560146121ef87870160408901615211565b6121fc606089018961522c565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b612282606085018561522c565b905081101561203f5781612299606086018661522c565b838181106122a9576122a9615271565b90506020028101906122bb9190615285565b6122c59080615794565b90506122d4606087018761522c565b848181106122e4576122e4615271565b90506020028101906122f69190615285565b6123009080615794565b61230d606089018961522c565b8681811061231d5761231d615271565b905060200281019061232f9190615285565b61233d906020810190615794565b61234a60608b018b61522c565b8881811061235a5761235a615271565b905060200281019061236c9190615285565b61237d906060810190604001614fb6565b60405160200161239397969594939291906157d6565b60408051601f198184030181529190529150600101612275565b6123b5613a04565b610fb381613a4f565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612444573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261246b91908101906156af565b915091508061248d57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f491906151e6565b82511461251a578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612556576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125658460400151613abd565b9150915081871461258c5760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615b44833981519152906001600160401b039081169083161115612649575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612668565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b448339815191528161268c86613cae565b9050612697866123be565b6126a6576001925050506116d2565b5f8681526004830160205260409020546001600160a01b031633146126cb57336112e9565b5f86815260048301602052604090205460a08201516126fa91600160b01b90046001600160401b031690615664565b6001600160401b03168160c001516001600160401b031610156127415760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156127595761275287866123f9565b9050612777565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061279c90611221565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612812573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061283691906151e6565b905080846007015f8a81526020019081526020015f205f82825461285a9190615546565b90915550501515979650505050505050565b5f80516020615b8483398151915280546001190161289d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128ac614e12565b5f80516020615b648339815191525f806128c861153887611f30565b9150915080156128ef57604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561292057612920615034565b600581111561293157612931615034565b815260200160018201805461294590615194565b80601f016020809104026020016040519081016040528092919081815260200182805461297190615194565b80156129bc5780601f10612993576101008083540402835291602001916129bc565b820191905f5260205f20905b81548152906001019060200180831161299f57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a2757612a27615034565b14158015612a485750600181516005811115612a4557612a45615034565b14155b15612a6957805160405163170cc93360e21b815261063191906004016151c6565b600381516005811115612a7e57612a7e615034565b03612a8c5760048152612a91565b600581525b836008018160200151604051612aa79190615422565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aeb57612aeb615034565b021790555060208201516001820190612b049082615477565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612baa57612baa615034565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c2d575f80fd5b505af11580156110e5573d5f803e3d5ffd5b6115186001600160a01b03831682613f92565b60015f80516020615b8483398151915255565b5f8181525f80516020615b248339815191526020526040808220815160e0810190925280545f80516020615b4483398151915293929190829060ff166003811115612cb257612cb2615034565b6003811115612cc357612cc3615034565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612df1575f84815260048701602052604090205461271090612da390600160a01b900461ffff168561557b565b612dad9190615592565b915081866007015f8681526020019081526020015f205f828254612dd19190615546565b90915550612de190508284615781565b9050612df1856020015182612be1565b612e068560200151610f938760600151611221565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e8357835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612ed257612e9a816001615781565b612ea590600861557b565b61ffff16868281518110612ebb57612ebb615271565b016020015160f81c901b9190911790600101612e86565b5061ffff811615612efc5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f5757612f13816003615781565b612f1e90600861557b565b63ffffffff1687612f30836002615546565b81518110612f4057612f40615271565b016020015160f81c901b9190911790600101612eff565b5063ffffffff8116600314612f7f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fd457612f9681601f615781565b612fa190600861557b565b88612fad836006615546565b81518110612fbd57612fbd615271565b016020015160f81c901b9190911790600101612f82565b505f805b600881101561303357612fec816007615781565b612ff790600861557b565b6001600160401b03168961300c836026615546565b8151811061301c5761301c615271565b016020015160f81c901b9190911790600101612fd8565b505f805b60088110156130925761304b816007615781565b61305690600861557b565b6001600160401b03168a61306b83602e615546565b8151811061307b5761307b615271565b016020015160f81c901b9190911790600101613037565b5091989097509095509350505050565b5f8082516027146130d857825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b6002811015613127576130ef816001615781565b6130fa90600861557b565b61ffff1685828151811061311057613110615271565b016020015160f81c901b91909117906001016130db565b5061ffff8116156131515760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156131ac57613168816003615781565b61317390600861557b565b63ffffffff1686613185836002615546565b8151811061319557613195615271565b016020015160f81c901b9190911790600101613154565b5063ffffffff81166002146131d457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613229576131eb81601f615781565b6131f690600861557b565b87613202836006615546565b8151811061321257613212615271565b016020015160f81c901b91909117906001016131d7565b505f8660268151811061323e5761323e615271565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b4483398151915290600160401b900461ffff90811690861610806132b2575061271061ffff8616115b156132d657604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b039081169085161015613312576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806133245750806001015483115b156133455760405163222d164360e21b815260048101849052602401610631565b825f61335082610ed3565b90505f61335d8983614025565b905060405180608001604052806133713390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615b448339815191528161344584610ed3565b90505f61345187611a30565b905061345c876123be565b61347c576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561349157613491615034565b146134b257805160405163170cc93360e21b815261063191906004016151c6565b5f8282608001516134c39190615664565b905083600201600a9054906101000a90046001600160401b031682604001516134ec919061583f565b6001600160401b0316816001600160401b0316111561352957604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806135358a84613701565b915091505f8a8360405160200161356392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135f6576135f6615034565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615ba4833981519152602052604081206002015481905f80516020615b6483398151915290600160801b90046001600160401b0316613749858261459d565b5f613753876147c0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137a38a858b611ee1565b6040518263ffffffff1660e01b81526004016137bf91906151d4565b6020604051808303815f875af11580156137db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ff91906151e6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b4483398151915290505f6138788460400151611a30565b90505f60038251600581111561389057613890615034565b14806138ae57506004825160058111156138ac576138ac615034565b145b156138be575060c08101516138fb565b6002825160058111156138d3576138d3615034565b036138df5750426138fb565b815160405163170cc93360e21b815261063191906004016151c6565b84608001516001600160401b0316816001600160401b03161161392257505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061394790611221565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156139d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fb91906151e6565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a4d57604051631afcd79f60e31b815260040160405180910390fd5b565b613a57613a04565b613a6081614835565b613a6861484e565b610fb360608201356080830135613a8560c0850160a08601614fb6565b613a9560e0860160c0870161586a565b613aa6610100870160e08801615883565b613ab861012088016101008901615211565b61485e565b5f808251602e14613af357825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b4257613b0a816001615781565b613b1590600861557b565b61ffff16858281518110613b2b57613b2b615271565b016020015160f81c901b9190911790600101613af6565b5061ffff811615613b6c5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613bc757613b83816003615781565b613b8e90600861557b565b63ffffffff1686613ba0836002615546565b81518110613bb057613bb0615271565b016020015160f81c901b9190911790600101613b6f565b5063ffffffff811615613bed57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c4257613c0481601f615781565b613c0f90600861557b565b87613c1b836006615546565b81518110613c2b57613c2b615271565b016020015160f81c901b9190911790600101613bf0565b505f805b6008811015613ca157613c5a816007615781565b613c6590600861557b565b6001600160401b031688613c7a836026615546565b81518110613c8a57613c8a615271565b016020015160f81c901b9190911790600101613c46565b5090969095509350505050565b613cb6614e12565b5f8281525f80516020615ba48339815191526020526040808220815160e0810190925280545f80516020615b6483398151915293929190829060ff166005811115613d0357613d03615034565b6005811115613d1457613d14615034565b8152602001600182018054613d2890615194565b80601f0160208091040260200160405190810160405280929190818152602001828054613d5490615194565b8015613d9f5780601f10613d7657610100808354040283529160200191613d9f565b820191905f5260205f20905b815481529060010190602001808311613d8257829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613e0d57613e0d615034565b14613e40575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016151c6565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e8457613e84615034565b021790555060208201516001820190613e9d9082615477565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f3b8582613701565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613fb55760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613ffe576040519150601f19603f3d011682016040523d82523d5f602084013e614003565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661406957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615b64833981519152426140886060860160408701614fb6565b6001600160401b03161115806140c257506140a66202a30042615546565b6140b66060860160408701614fb6565b6001600160401b031610155b156140fc576140d76060850160408601614fb6565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b61411161410c60608601866158a3565b61498d565b61412161410c60808601866158a3565b60306141306020860186615794565b905014614162576141446020850185615794565b6040516326475b2f60e11b8152610631925060040190815260200190565b61416c8480615794565b90505f036141995761417e8480615794565b604051633e08a12560e11b81526004016106319291906158b7565b5f600882016141a88680615794565b6040516141b6929190615655565b908152602001604051809103902054146141ef576141d48480615794565b60405163a41f772f60e01b81526004016106319291906158b7565b6141f9835f61459d565b6040805160e08101909152815481525f908190614305906020810161421e8980615794565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614266908a018a615794565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016142af60608a0160408b01614fb6565b6001600160401b031681526020016142ca60608a018a6158a3565b6142d3906158e5565b81526020016142e560808a018a6158a3565b6142ee906158e5565b8152602001876001600160401b0316815250614af6565b5f828152600686016020526040902091935091506143238282615477565b5081600884016143338880615794565b604051614341929190615655565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061437d9085906004016151d4565b6020604051808303815f875af1158015614399573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143bd91906151e6565b6040805160e0810190915290915080600181526020016143dd8980615794565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561446c5761446c615034565b0217905550602082015160018201906144859082615477565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806145238880615794565b604051614531929190615655565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061456f9190614fb6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615b648339815191525f6001600160401b0380841690851611156145d1576145ca8385615684565b90506145de565b6145db8484615684565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061464057506001840154815161463c916001600160401b031690615546565b8210155b15614666576001600160401b038316606082015281815260408101516020820152614685565b82816060018181516146789190615664565b6001600160401b03169052505b606081015161469590606461583f565b602082015160018601546001600160401b0392909216916146c09190600160401b900460ff1661557b565b10156146f057606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b03168160400181815161470b9190615546565b9052506040810180516001600160401b038716919061472b908390615781565b9052506001840154604082015160649161475091600160401b90910460ff169061557b565b1015614777578060400151604051635943317f60e01b815260040161063191815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615ba48339815191526020526040812060020180545f80516020615b64833981519152919060089061480a90600160401b90046001600160401b03166159ac565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61483d613a04565b614845614ce3565b610fb381614ceb565b614856613a04565b613a4d614dd3565b614866613a04565b5f80516020615b4483398151915261ffff8416158061488a575061271061ffff8516115b156148ae57604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156148d25760405163222d164360e21b815260048101889052602401610631565b60ff831615806148e55750600a60ff8416115b156149085760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b61499a6020820182614f5f565b63ffffffff161580156149ba57506149b5602082018261522c565b151590505b15614a01576149cc6020820182614f5f565b6149d9602083018361522c565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b614a0e602082018261522c565b9050614a1d6020830183614f5f565b63ffffffff161115614a36576149cc6020820182614f5f565b60015b614a46602083018361522c565b905081101561151857614a5c602083018361522c565b614a67600184615781565b818110614a7657614a76615271565b9050602002016020810190614a8b9190615211565b6001600160a01b0316614aa1602084018461522c565b83818110614ab157614ab1615271565b9050602002016020810190614ac69190615211565b6001600160a01b03161015614aee57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a39565b5f6060826040015151603014614b1f5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b60988a9860019892979296909590949093909291016159c7565b60405160208183030381529060405290505f5b84608001516020015151811015614bd257818560800151602001518281518110614b9f57614b9f615271565b6020026020010151604051602001614bb8929190615a81565b60408051601f198184030181529190529150600101614b73565b5060a0840151805160209182015151604051614bf2938593929101615ab7565b60405160208183030381529060405290505f5b8460a001516020015151811015614c6457818560a00151602001518281518110614c3157614c31615271565b6020026020010151604051602001614c4a929190615a81565b60408051601f198184030181529190529150600101614c05565b5060c0840151604051614c7b918391602001615af2565b6040516020818303038152906040529050600281604051614c9c9190615422565b602060405180830381855afa158015614cb7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614cda91906151e6565b94909350915050565b613a4d613a04565b614cf3613a04565b80355f80516020615b648339815191529081556014614d186060840160408501615883565b60ff161180614d375750614d326060830160408401615883565b60ff16155b15614d6b57614d4c6060830160408401615883565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614d7b6060830160408401615883565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614dac6040830160208401614fb6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c52613a04565b508054614de790615194565b5f825580601f10614df6575050565b601f0160209004905f5260205f2090810190610fb39190614e4f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e63575f8155600101614e50565b5090565b8015158114610fb3575f80fd5b803563ffffffff81168114611a2b575f80fd5b5f805f60608486031215614e99575f80fd5b833592506020840135614eab81614e67565b9150614eb960408501614e74565b90509250925092565b5f60208284031215614ed2575f80fd5b5035919050565b5f8060408385031215614eea575f80fd5b82356001600160401b03811115614eff575f80fd5b830160808186031215614f10575f80fd5b9150614f1e60208401614e74565b90509250929050565b5f6101208284031215614f38575f80fd5b50919050565b5f8060408385031215614f4f575f80fd5b82359150614f1e60208401614e74565b5f60208284031215614f6f575f80fd5b6116d282614e74565b5f8060408385031215614f89575f80fd5b614f9283614e74565b946020939093013593505050565b80356001600160401b0381168114611a2b575f80fd5b5f60208284031215614fc6575f80fd5b6116d282614fa0565b803561ffff81168114611a2b575f80fd5b5f805f60608486031215614ff2575f80fd5b83356001600160401b03811115615007575f80fd5b840160a08187031215615018575f80fd5b925061502660208501614fcf565b9150614eb960408501614fa0565b634e487b7160e01b5f52602160045260245ffd5b6006811061505857615058615034565b9052565b5f5b8381101561507657818101518382015260200161505e565b50505f910152565b5f815180845261509581602086016020860161505c565b601f01601f19169290920160200192915050565b602081526150bb602082018351615048565b5f602083015160e060408401526150d661010084018261507e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f806020838503121561513a575f80fd5b82356001600160401b0380821115615150575f80fd5b818501915085601f830112615163575f80fd5b813581811115615171575f80fd5b866020828501011115615182575f80fd5b60209290920196919550909350505050565b600181811c908216806151a857607f821691505b602082108103614f3857634e487b7160e01b5f52602260045260245ffd5b60208101610ee38284615048565b602081525f6116d2602083018461507e565b5f602082840312156151f6575f80fd5b5051919050565b6001600160a01b0381168114610fb3575f80fd5b5f60208284031215615221575f80fd5b81356116d2816151fd565b5f808335601e19843603018112615241575f80fd5b8301803591506001600160401b0382111561525a575f80fd5b6020019150600581901b3603821315613851575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615299575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152d9576152d96152a3565b60405290565b604080519081016001600160401b03811182821017156152d9576152d96152a3565b604051601f8201601f191681016001600160401b0381118282101715615329576153296152a3565b604052919050565b5f6001600160401b03821115615349576153496152a3565b50601f01601f191660200190565b5f82601f830112615366575f80fd5b813561537961537482615331565b615301565b81815284602083860101111561538d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153b9575f80fd5b6153c16152b7565b82356001600160401b03808211156153d7575f80fd5b6153e336838701615357565b835260208501359150808211156153f8575f80fd5b5061540536828601615357565b60208301525061541760408401614fa0565b604082015292915050565b5f825161529981846020870161505c565b601f82111561063a57805f5260205f20601f840160051c810160208510156154585750805b601f840160051c820191505b818110156118bb575f8155600101615464565b81516001600160401b03811115615490576154906152a3565b6154a48161549e8454615194565b84615433565b602080601f8311600181146154d7575f84156154c05750858301515b5f19600386901b1c1916600185901b1785556110e5565b5f85815260208120601f198616915b82811015615505578886015182559484019460019091019084016154e6565b508582101561552257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ee357610ee3615532565b5f63ffffffff80831681810361557157615571615532565b6001019392505050565b8082028115828204841417610ee357610ee3615532565b5f826155ac57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155c5576155c5615034565b91905290565b5f60208083525f84546155dd81615194565b806020870152604060018084165f81146155fe576001811461561a57615647565b60ff19851660408a0152604084151560051b8a01019550615647565b895f5260205f205f5b8581101561563e5781548b8201860152908301908801615623565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561203f5761203f615532565b6001600160401b0382811682821603908082111561203f5761203f615532565b8051611a2b81614e67565b5f80604083850312156156c0575f80fd5b82516001600160401b03808211156156d6575f80fd5b90840190606082870312156156e9575f80fd5b6156f16152b7565b82518152602080840151615704816151fd565b82820152604084015183811115615719575f80fd5b80850194505087601f85011261572d575f80fd5b8351925061573d61537484615331565b8381528882858701011115615750575f80fd5b61575f8483830184880161505c565b806040840152508195506157748188016156a4565b9450505050509250929050565b81810381811115610ee357610ee3615532565b5f808335601e198436030181126157a9575f80fd5b8301803591506001600160401b038211156157c2575f80fd5b602001915036819003821315613851575f80fd5b5f88516157e7818460208d0161505c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461586257615862615532565b505092915050565b5f6020828403121561587a575f80fd5b6116d282614fcf565b5f60208284031215615893575f80fd5b813560ff811681146116d2575f80fd5b5f8235603e19833603018112615299575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156158f5575f80fd5b6158fd6152df565b61590683614e74565b81526020808401356001600160401b0380821115615922575f80fd5b9085019036601f830112615934575f80fd5b813581811115615946576159466152a3565b8060051b9150615957848301615301565b8181529183018401918481019036841115615970575f80fd5b938501935b8385101561599a578435925061598a836151fd565b8282529385019390850190615975565b94860194909452509295945050505050565b5f6001600160401b0380831681810361557157615571615532565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a0d81602a850160208b0161505c565b865190830190615a2481602a840160208b0161505c565b60c087901b6001600160c01b031916602a9290910191820152615a56603282018660e01b6001600160e01b0319169052565b615a6f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a9281846020880161505c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615ac881846020890161505c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b0381846020880161505c565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index 6db96b902..a072d6ff7 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -79,8 +79,8 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516139d53803806139d583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138888061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612c30565b610312565b005b610149610159366004612c5f565b610529565b61014961016c366004612cad565b610a15565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612c30565b610a23565b6040516001600160401b03909116815260200161018a565b610149610a37565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612c30565b610a4a565b6101cd61025a366004612cdc565b610a5f565b61014961026d366004612cad565b610a7b565b6102216005600160991b0181565b6101cd5f8051602061383c83398151915281565b6101496102a2366004612c30565b610c04565b6101e3601481565b6101496102bd366004612d35565b610d41565b6102d56102d0366004612c30565b610e4f565b60405161018a9190612df2565b6101a66202a30081565b6101496102fa366004612e72565b610f9e565b6101cd61030d366004612e94565b610fdb565b5f8181525f8051602061385c8339815191526020526040808220815160e0810190925280545f8051602061383c83398151915293929190829060ff16600581111561035f5761035f612d71565b600581111561037057610370612d71565b815260200160018201805461038490612eff565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612eff565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612d71565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f37565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611036565b6040518263ffffffff1660e01b81526004016104e39190612f45565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612f57565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061383c8339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612f57565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612e72565b6001600160a01b03161461065f5761063a6060840160408501612e72565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612f6e565b905090505f805b828163ffffffff161015610955575f6106906060880188612f6e565b8363ffffffff168181106106a6576106a6612fb3565b90506020028101906106b89190612fc7565b6106c1906130eb565b80516040519192505f9160088801916106d991613164565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612f45565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261075291613164565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612f57565b90508086600801835f01516040516107a89190613164565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612d71565b02179055506020820151600182019061084390826131c0565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e8911685613293565b82516040519195506108f991613164565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e906132a6565b9050610674565b50600483018190555f61097361096a86611085565b6040015161119b565b90505f61097f87611328565b90505f6002826040516109929190613164565b602060405180830381855afa1580156109ad573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109d09190612f57565b90508281146109fc57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a1e81611502565b505050565b5f610a2d82610e4f565b6080015192915050565b610a3f611840565b610a485f61189b565b565b610a52611840565b610a5b8161190b565b5050565b5f610a68611840565b610a728383611bef565b90505b92915050565b5f8051602061383c8339815191525f80610aa0610a9785611085565b60400151612167565b9150915080610ac657604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610ae090612eff565b90505f03610b045760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b2a57610b2a612d71565b14610b5d575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f37565b5f8281526006840160205260408120610b7591612ba4565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061383c8339815191529190610c4b90612eff565b90505f03610c6f5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610c9557610c95612d71565b14610cc8575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f37565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d0191906004016132c8565b6020604051808303815f875af1158015610d1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612f57565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610d855750825b90505f826001600160401b03166001148015610da05750303b155b905081158015610dae575080155b15610dcc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610df657845460ff60401b1916600160401b1785555b610e008787612323565b8315610e4657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e57612bdb565b5f8281525f8051602061385c833981519152602052604090819020815160e0810190925280545f8051602061383c833981519152929190829060ff166005811115610ea457610ea4612d71565b6005811115610eb557610eb5612d71565b8152602001600182018054610ec990612eff565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef590612eff565b8015610f405780601f10610f1757610100808354040283529160200191610f40565b820191905f5260205f20905b815481529060010190602001808311610f2357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fa6611840565b6001600160a01b038116610fcf57604051631e4fbdf760e01b81525f6004820152602401610499565b610fd88161189b565b50565b6040515f905f8051602061383c833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061101e9086908690613352565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156110e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111109190810190613370565b915091508061113257604051636b2f19e960e01b815260040160405180910390fd5b815115611158578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b031615611194576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f81516026146111d057815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561121f576111e7816001613442565b6111f2906008613455565b61ffff1684828151811061120857611208612fb3565b016020015160f81c901b91909117906001016111d3565b5061ffff8116156112495760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112a457611260816003613442565b61126b906008613455565b63ffffffff168561127d836002613293565b8151811061128d5761128d612fb3565b016020015160f81c901b919091179060010161124c565b5063ffffffff8116156112ca57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561131f576112e181601f613442565b6112ec906008613455565b866112f8836006613293565b8151811061130857611308612fb3565b016020015160f81c901b91909117906001016112cd565b50949350505050565b60605f8083356020850135601461134487870160408901612e72565b6113516060890189612f6e565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6113d76060850185612f6e565b905081101561119457816113ee6060860186612f6e565b838181106113fe576113fe612fb3565b90506020028101906114109190612fc7565b61141a908061346c565b90506114296060870187612f6e565b8481811061143957611439612fb3565b905060200281019061144b9190612fc7565b611455908061346c565b6114626060890189612f6e565b8681811061147257611472612fb3565b90506020028101906114849190612fc7565b61149290602081019061346c565b61149f60608b018b612f6e565b888181106114af576114af612fb3565b90506020028101906114c19190612fc7565b6114d29060608101906040016134ae565b6040516020016114e897969594939291906134c7565b60408051601f1981840301815291905291506001016113ca565b5f61150b612bdb565b5f8051602061383c8339815191525f80611527610a9787611085565b91509150801561154e57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561157f5761157f612d71565b600581111561159057611590612d71565b81526020016001820180546115a490612eff565b80601f01602080910402602001604051908101604052809291908181526020018280546115d090612eff565b801561161b5780601f106115f25761010080835404028352916020019161161b565b820191905f5260205f20905b8154815290600101906020018083116115fe57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561168657611686612d71565b141580156116a757506001815160058111156116a4576116a4612d71565b14155b156116c857805160405163170cc93360e21b81526104999190600401612f37565b6003815160058111156116dd576116dd612d71565b036116eb57600481526116f0565b600581525b8360080181602001516040516117069190613164565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561174a5761174a612d71565b02179055506020820151600182019061176390826131c0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561180957611809612d71565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a485760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611913612bdb565b5f8281525f8051602061385c8339815191526020526040808220815160e0810190925280545f8051602061383c83398151915293929190829060ff16600581111561196057611960612d71565b600581111561197157611971612d71565b815260200160018201805461198590612eff565b80601f01602080910402602001604051908101604052809291908181526020018280546119b190612eff565b80156119fc5780601f106119d3576101008083540402835291602001916119fc565b820191905f5260205f20905b8154815290600101906020018083116119df57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611a6a57611a6a612d71565b14611a9d575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f37565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611ae157611ae1612d71565b021790555060208201516001820190611afa90826131c0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611b98858261233d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c3357604051637fab81e560e01b815260040160405180910390fd5b5f8051602061383c83398151915242611c5260608601604087016134ae565b6001600160401b0316111580611c8c5750611c706202a30042613293565b611c8060608601604087016134ae565b6001600160401b031610155b15611cc657611ca160608501604086016134ae565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611cdb611cd66060860186613530565b612494565b611ceb611cd66080860186613530565b6030611cfa602086018661346c565b905014611d2c57611d0e602085018561346c565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d36848061346c565b90505f03611d6357611d48848061346c565b604051633e08a12560e11b8152600401610499929190613544565b5f60088201611d72868061346c565b604051611d80929190613352565b90815260200160405180910390205414611db957611d9e848061346c565b60405163a41f772f60e01b8152600401610499929190613544565b611dc3835f6125fd565b6040805160e08101909152815481525f908190611ecf9060208101611de8898061346c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e30908a018a61346c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611e7960608a0160408b016134ae565b6001600160401b03168152602001611e9460608a018a613530565b611e9d90613572565b8152602001611eaf60808a018a613530565b611eb890613572565b8152602001876001600160401b03168152506127d7565b5f82815260068601602052604090209193509150611eed82826131c0565b508160088401611efd888061346c565b604051611f0b929190613352565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f47908590600401612f45565b6020604051808303815f875af1158015611f63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f879190612f57565b6040805160e081019091529091508060018152602001611fa7898061346c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561203657612036612d71565b02179055506020820151600182019061204f90826131c0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806120ed888061346c565b6040516120fb929190613352565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061213991906134ae565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80825160271461219d57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b60028110156121ec576121b4816001613442565b6121bf906008613455565b61ffff168582815181106121d5576121d5612fb3565b016020015160f81c901b91909117906001016121a0565b5061ffff8116156122165760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156122715761222d816003613442565b612238906008613455565b63ffffffff168661224a836002613293565b8151811061225a5761225a612fb3565b016020015160f81c901b9190911790600101612219565b5063ffffffff811660021461229957604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122ee576122b081601f613442565b6122bb906008613455565b876122c7836006613293565b815181106122d7576122d7612fb3565b016020015160f81c901b919091179060010161229c565b505f8660268151811061230357612303612fb3565b016020015191976001600160f81b03199092161515965090945050505050565b61232b6129c4565b61233482612a0d565b610a5b81612a26565b5f8281525f8051602061385c833981519152602052604081206002015481905f8051602061383c83398151915290600160801b90046001600160401b031661238585826125fd565b5f61238f87612a37565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123df8a858b611036565b6040518263ffffffff1660e01b81526004016123fb9190612f45565b6020604051808303815f875af1158015612417573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243b9190612f57565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124a16020820182612cad565b63ffffffff161580156124c157506124bc6020820182612f6e565b151590505b15612508576124d36020820182612cad565b6124e06020830183612f6e565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6125156020820182612f6e565b90506125246020830183612cad565b63ffffffff16111561253d576124d36020820182612cad565b60015b61254d6020830183612f6e565b9050811015610a5b576125636020830183612f6e565b61256e600184613442565b81811061257d5761257d612fb3565b90506020020160208101906125929190612e72565b6001600160a01b03166125a86020840184612f6e565b838181106125b8576125b8612fb3565b90506020020160208101906125cd9190612e72565b6001600160a01b031610156125f557604051630dbc8d5f60e31b815260040160405180910390fd5b600101612540565b5f8051602061383c8339815191525f6001600160401b0380841690851611156126315761262a8385613639565b905061263e565b61263b8484613639565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806126a057506001840154815161269c916001600160401b031690613293565b8210155b156126c6576001600160401b0383166060820152818152604081015160208201526126e5565b82816060018181516126d89190613659565b6001600160401b03169052505b60608101516126f5906064613679565b602082015160018601546001600160401b0392909216916127209190600160401b900460ff16613455565b101561275057606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b03168160400181815161276b9190613293565b9052506040810180516001600160401b038716919061278b908390613442565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146128005760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98612841988a9860019892979296909590949093909291016136a4565b60405160208183030381529060405290505f5b846080015160200151518110156128b35781856080015160200151828151811061288057612880612fb3565b602002602001015160405160200161289992919061375e565b60408051601f198184030181529190529150600101612854565b5060a08401518051602091820151516040516128d3938593929101613794565b60405160208183030381529060405290505f5b8460a00151602001515181101561294557818560a0015160200151828151811061291257612912612fb3565b602002602001015160405160200161292b92919061375e565b60408051601f1981840301815291905291506001016128e6565b5060c084015160405161295c9183916020016137cf565b604051602081830303815290604052905060028160405161297d9190613164565b602060405180830381855afa158015612998573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129bb9190612f57565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a4857604051631afcd79f60e31b815260040160405180910390fd5b612a156129c4565b612a1d612aac565b610fd881612ab4565b612a2e6129c4565b610fd881612b9c565b5f8181525f8051602061385c8339815191526020526040812060020180545f8051602061383c8339815191529190600890612a8190600160401b90046001600160401b0316613800565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a486129c4565b612abc6129c4565b80355f8051602061383c8339815191529081556014612ae1606084016040850161381b565b60ff161180612b005750612afb606083016040840161381b565b60ff16155b15612b3457612b15606083016040840161381b565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612b44606083016040840161381b565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612b7560408301602084016134ae565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fa66129c4565b508054612bb090612eff565b5f825580601f10612bbf575050565b601f0160209004905f5260205f2090810190610fd89190612c18565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612c2c575f8155600101612c19565b5090565b5f60208284031215612c40575f80fd5b5035919050565b803563ffffffff81168114612c5a575f80fd5b919050565b5f8060408385031215612c70575f80fd5b82356001600160401b03811115612c85575f80fd5b830160808186031215612c96575f80fd5b9150612ca460208401612c47565b90509250929050565b5f60208284031215612cbd575f80fd5b610a7282612c47565b80356001600160401b0381168114612c5a575f80fd5b5f8060408385031215612ced575f80fd5b82356001600160401b03811115612d02575f80fd5b830160a08186031215612d13575f80fd5b9150612ca460208401612cc6565b6001600160a01b0381168114610fd8575f80fd5b5f808284036080811215612d47575f80fd5b6060811215612d54575f80fd5b508291506060830135612d6681612d21565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612da157634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612dbf578181015183820152602001612da7565b50505f910152565b5f8151808452612dde816020860160208601612da5565b601f01601f19169290920160200192915050565b60208152612e04602082018351612d85565b5f602083015160e06040840152612e1f610100840182612dc7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612e82575f80fd5b8135612e8d81612d21565b9392505050565b5f8060208385031215612ea5575f80fd5b82356001600160401b0380821115612ebb575f80fd5b818501915085601f830112612ece575f80fd5b813581811115612edc575f80fd5b866020828501011115612eed575f80fd5b60209290920196919550909350505050565b600181811c90821680612f1357607f821691505b602082108103612f3157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610a758284612d85565b602081525f610a726020830184612dc7565b5f60208284031215612f67575f80fd5b5051919050565b5f808335601e19843603018112612f83575f80fd5b8301803591506001600160401b03821115612f9c575f80fd5b6020019150600581901b360382131561248d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612fdb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561301b5761301b612fe5565b60405290565b604080519081016001600160401b038111828210171561301b5761301b612fe5565b604051601f8201601f191681016001600160401b038111828210171561306b5761306b612fe5565b604052919050565b5f6001600160401b0382111561308b5761308b612fe5565b50601f01601f191660200190565b5f82601f8301126130a8575f80fd5b81356130bb6130b682613073565b613043565b8181528460208386010111156130cf575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156130fb575f80fd5b613103612ff9565b82356001600160401b0380821115613119575f80fd5b61312536838701613099565b8352602085013591508082111561313a575f80fd5b5061314736828601613099565b60208301525061315960408401612cc6565b604082015292915050565b5f8251612fdb818460208701612da5565b601f821115610a1e57805f5260205f20601f840160051c8101602085101561319a5750805b601f840160051c820191505b818110156131b9575f81556001016131a6565b5050505050565b81516001600160401b038111156131d9576131d9612fe5565b6131ed816131e78454612eff565b84613175565b602080601f831160018114613220575f84156132095750858301515b5f19600386901b1c1916600185901b178555613277565b5f85815260208120601f198616915b8281101561324e5788860151825594840194600190910190840161322f565b508582101561326b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a7557610a7561327f565b5f63ffffffff8083168181036132be576132be61327f565b6001019392505050565b5f60208083525f84546132da81612eff565b806020870152604060018084165f81146132fb576001811461331757613344565b60ff19851660408a0152604084151560051b8a01019550613344565b895f5260205f205f5b8581101561333b5781548b8201860152908301908801613320565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612c5a575f80fd5b5f8060408385031215613381575f80fd5b82516001600160401b0380821115613397575f80fd5b90840190606082870312156133aa575f80fd5b6133b2612ff9565b825181526020808401516133c581612d21565b828201526040840151838111156133da575f80fd5b80850194505087601f8501126133ee575f80fd5b835192506133fe6130b684613073565b8381528882858701011115613411575f80fd5b61342084838301848801612da5565b80604084015250819550613435818801613361565b9450505050509250929050565b81810381811115610a7557610a7561327f565b8082028115828204841417610a7557610a7561327f565b5f808335601e19843603018112613481575f80fd5b8301803591506001600160401b0382111561349a575f80fd5b60200191503681900382131561248d575f80fd5b5f602082840312156134be575f80fd5b610a7282612cc6565b5f88516134d8818460208d01612da5565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e19833603018112612fdb575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215613582575f80fd5b61358a613021565b61359383612c47565b81526020808401356001600160401b03808211156135af575f80fd5b9085019036601f8301126135c1575f80fd5b8135818111156135d3576135d3612fe5565b8060051b91506135e4848301613043565b81815291830184019184810190368411156135fd575f80fd5b938501935b83851015613627578435925061361783612d21565b8282529385019390850190613602565b94860194909452509295945050505050565b6001600160401b038281168282160390808211156111945761119461327f565b6001600160401b038181168382160190808211156111945761119461327f565b6001600160401b0381811683821602808216919082811461369c5761369c61327f565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516136ea81602a850160208b01612da5565b86519083019061370181602a840160208b01612da5565b60c087901b6001600160c01b031916602a9290910191820152613733603282018660e01b6001600160e01b0319169052565b61374c603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f835161376f818460208801612da5565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516137a5818460208901612da5565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516137e0818460208801612da5565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b038083168181036132be576132be61327f565b5f6020828403121561382b575f80fd5b813560ff81168114612e8d575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051613a5c380380613a5c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61390f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612cb7565b610312565b005b610149610159366004612ce6565b610529565b61014961016c366004612d34565b610a53565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612cb7565b610a61565b6040516001600160401b03909116815260200161018a565b610149610a75565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612cb7565b610a88565b6101cd61025a366004612d63565b610a9d565b61014961026d366004612d34565b610ab9565b6102216005600160991b0181565b6101cd5f805160206138c383398151915281565b6101496102a2366004612cb7565b610c42565b6101e3601481565b6101496102bd366004612dbc565b610d7f565b6102d56102d0366004612cb7565b610e8d565b60405161018a9190612e79565b6101a66202a30081565b6101496102fa366004612ef9565b610fdc565b6101cd61030d366004612f1b565b611019565b5f8181525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561035f5761035f612df8565b600581111561037057610370612df8565b815260200160018201805461038490612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612f86565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612df8565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611074565b6040518263ffffffff1660e01b81526004016104e39190612fcc565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612fde565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206138c38339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612fde565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612ef9565b6001600160a01b03161461065f5761063a6060840160408501612ef9565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612ff5565b905090505f805b828163ffffffff161015610955575f6106906060880188612ff5565b8363ffffffff168181106106a6576106a661303a565b90506020028101906106b8919061304e565b6106c190613172565b80516040519192505f9160088801916106d9916131eb565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612fcc565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610752916131eb565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612fde565b90508086600801835f01516040516107a891906131eb565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612df8565b0217905550602082015160018201906108439082613247565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e891168561331a565b82516040519195506108f9916131eb565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e9061332d565b9050610674565b5060048301819055600183015460649061097990600160401b900460ff168361334f565b101561099b57604051635943317f60e01b815260048101829052602401610499565b5f6109b16109a8866110c3565b604001516111d9565b90505f6109bd87611366565b90505f6002826040516109d091906131eb565b602060405180830381855afa1580156109eb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a0e9190612fde565b9050828114610a3a57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a5c81611540565b505050565b5f610a6b82610e8d565b6080015192915050565b610a7d61187e565b610a865f6118d9565b565b610a9061187e565b610a9981611949565b5050565b5f610aa661187e565b610ab08383611c2d565b90505b92915050565b5f805160206138c38339815191525f80610ade610ad5856110c3565b604001516121a5565b9150915080610b0457604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610b1e90612f86565b90505f03610b425760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b6857610b68612df8565b14610b9b575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f8281526006840160205260408120610bb391612c2b565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206138c38339815191529190610c8990612f86565b90505f03610cad5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610cd357610cd3612df8565b14610d06575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d3f9190600401613366565b6020604051808303815f875af1158015610d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190612fde565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dc35750825b90505f826001600160401b03166001148015610dde5750303b155b905081158015610dec575080155b15610e0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3457845460ff60401b1916600160401b1785555b610e3e8787612361565b8315610e8457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e95612c62565b5f8281525f805160206138e3833981519152602052604090819020815160e0810190925280545f805160206138c3833981519152929190829060ff166005811115610ee257610ee2612df8565b6005811115610ef357610ef3612df8565b8152602001600182018054610f0790612f86565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3390612f86565b8015610f7e5780601f10610f5557610100808354040283529160200191610f7e565b820191905f5260205f20905b815481529060010190602001808311610f6157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fe461187e565b6001600160a01b03811661100d57604051631e4fbdf760e01b81525f6004820152602401610499565b611016816118d9565b50565b6040515f905f805160206138c3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061105c90869086906133f0565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611127573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261114e919081019061340e565b915091508061117057604051636b2f19e960e01b815260040160405180910390fd5b815115611196578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156111d2576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f815160261461120e57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561125d576112258160016134e0565b61123090600861334f565b61ffff168482815181106112465761124661303a565b016020015160f81c901b9190911790600101611211565b5061ffff8116156112875760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112e25761129e8160036134e0565b6112a990600861334f565b63ffffffff16856112bb83600261331a565b815181106112cb576112cb61303a565b016020015160f81c901b919091179060010161128a565b5063ffffffff81161561130857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561135d5761131f81601f6134e0565b61132a90600861334f565b8661133683600661331a565b815181106113465761134661303a565b016020015160f81c901b919091179060010161130b565b50949350505050565b60605f8083356020850135601461138287870160408901612ef9565b61138f6060890189612ff5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6114156060850185612ff5565b90508110156111d2578161142c6060860186612ff5565b8381811061143c5761143c61303a565b905060200281019061144e919061304e565b61145890806134f3565b90506114676060870187612ff5565b848181106114775761147761303a565b9050602002810190611489919061304e565b61149390806134f3565b6114a06060890189612ff5565b868181106114b0576114b061303a565b90506020028101906114c2919061304e565b6114d09060208101906134f3565b6114dd60608b018b612ff5565b888181106114ed576114ed61303a565b90506020028101906114ff919061304e565b611510906060810190604001613535565b604051602001611526979695949392919061354e565b60408051601f198184030181529190529150600101611408565b5f611549612c62565b5f805160206138c38339815191525f80611565610ad5876110c3565b91509150801561158c57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156115bd576115bd612df8565b60058111156115ce576115ce612df8565b81526020016001820180546115e290612f86565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90612f86565b80156116595780601f1061163057610100808354040283529160200191611659565b820191905f5260205f20905b81548152906001019060200180831161163c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156116c4576116c4612df8565b141580156116e557506001815160058111156116e2576116e2612df8565b14155b1561170657805160405163170cc93360e21b81526104999190600401612fbe565b60038151600581111561171b5761171b612df8565b03611729576004815261172e565b600581525b83600801816020015160405161174491906131eb565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561178857611788612df8565b0217905550602082015160018201906117a19082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561184757611847612df8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118b07f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a865760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611951612c62565b5f8281525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561199e5761199e612df8565b60058111156119af576119af612df8565b81526020016001820180546119c390612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546119ef90612f86565b8015611a3a5780601f10611a1157610100808354040283529160200191611a3a565b820191905f5260205f20905b815481529060010190602001808311611a1d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611aa857611aa8612df8565b14611adb575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611b1f57611b1f612df8565b021790555060208201516001820190611b389082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611bd6858261237b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c7157604051637fab81e560e01b815260040160405180910390fd5b5f805160206138c383398151915242611c906060860160408701613535565b6001600160401b0316111580611cca5750611cae6202a3004261331a565b611cbe6060860160408701613535565b6001600160401b031610155b15611d0457611cdf6060850160408601613535565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611d19611d1460608601866135b7565b6124d2565b611d29611d1460808601866135b7565b6030611d3860208601866134f3565b905014611d6a57611d4c60208501856134f3565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d7484806134f3565b90505f03611da157611d8684806134f3565b604051633e08a12560e11b81526004016104999291906135cb565b5f60088201611db086806134f3565b604051611dbe9291906133f0565b90815260200160405180910390205414611df757611ddc84806134f3565b60405163a41f772f60e01b81526004016104999291906135cb565b611e01835f61263b565b6040805160e08101909152815481525f908190611f0d9060208101611e2689806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e6e908a018a6134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611eb760608a0160408b01613535565b6001600160401b03168152602001611ed260608a018a6135b7565b611edb906135f9565b8152602001611eed60808a018a6135b7565b611ef6906135f9565b8152602001876001600160401b031681525061285e565b5f82815260068601602052604090209193509150611f2b8282613247565b508160088401611f3b88806134f3565b604051611f499291906133f0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f85908590600401612fcc565b6020604051808303815f875af1158015611fa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc59190612fde565b6040805160e081019091529091508060018152602001611fe589806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561207457612074612df8565b02179055506020820151600182019061208d9082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061212b88806134f3565b6040516121399291906133f0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906121779190613535565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8082516027146121db57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b600281101561222a576121f28160016134e0565b6121fd90600861334f565b61ffff168582815181106122135761221361303a565b016020015160f81c901b91909117906001016121de565b5061ffff8116156122545760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156122af5761226b8160036134e0565b61227690600861334f565b63ffffffff168661228883600261331a565b815181106122985761229861303a565b016020015160f81c901b9190911790600101612257565b5063ffffffff81166002146122d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561232c576122ee81601f6134e0565b6122f990600861334f565b8761230583600661331a565b815181106123155761231561303a565b016020015160f81c901b91909117906001016122da565b505f866026815181106123415761234161303a565b016020015191976001600160f81b03199092161515965090945050505050565b612369612a4b565b61237282612a94565b610a9981612aad565b5f8281525f805160206138e3833981519152602052604081206002015481905f805160206138c383398151915290600160801b90046001600160401b03166123c3858261263b565b5f6123cd87612abe565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241d8a858b611074565b6040518263ffffffff1660e01b81526004016124399190612fcc565b6020604051808303815f875af1158015612455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124799190612fde565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124df6020820182612d34565b63ffffffff161580156124ff57506124fa6020820182612ff5565b151590505b15612546576125116020820182612d34565b61251e6020830183612ff5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6125536020820182612ff5565b90506125626020830183612d34565b63ffffffff16111561257b576125116020820182612d34565b60015b61258b6020830183612ff5565b9050811015610a99576125a16020830183612ff5565b6125ac6001846134e0565b8181106125bb576125bb61303a565b90506020020160208101906125d09190612ef9565b6001600160a01b03166125e66020840184612ff5565b838181106125f6576125f661303a565b905060200201602081019061260b9190612ef9565b6001600160a01b0316101561263357604051630dbc8d5f60e31b815260040160405180910390fd5b60010161257e565b5f805160206138c38339815191525f6001600160401b03808416908516111561266f5761266883856136c0565b905061267c565b61267984846136c0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806126de5750600184015481516126da916001600160401b03169061331a565b8210155b15612704576001600160401b038316606082015281815260408101516020820152612723565b828160600181815161271691906136e0565b6001600160401b03169052505b6060810151612733906064613700565b602082015160018601546001600160401b03929092169161275e9190600160401b900460ff1661334f565b101561278e57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b0316816040018181516127a9919061331a565b9052506040810180516001600160401b03871691906127c99083906134e0565b905250600184015460408201516064916127ee91600160401b90910460ff169061334f565b1015612815578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146128875760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986128c8988a98600198929792969095909490939092910161372b565b60405160208183030381529060405290505f5b8460800151602001515181101561293a578185608001516020015182815181106129075761290761303a565b60200260200101516040516020016129209291906137e5565b60408051601f1981840301815291905291506001016128db565b5060a084015180516020918201515160405161295a93859392910161381b565b60405160208183030381529060405290505f5b8460a0015160200151518110156129cc57818560a001516020015182815181106129995761299961303a565b60200260200101516040516020016129b29291906137e5565b60408051601f19818403018152919052915060010161296d565b5060c08401516040516129e3918391602001613856565b6040516020818303038152906040529050600281604051612a0491906131eb565b602060405180830381855afa158015612a1f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a429190612fde565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a8657604051631afcd79f60e31b815260040160405180910390fd5b612a9c612a4b565b612aa4612b33565b61101681612b3b565b612ab5612a4b565b61101681612c23565b5f8181525f805160206138e38339815191526020526040812060020180545f805160206138c38339815191529190600890612b0890600160401b90046001600160401b0316613887565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a86612a4b565b612b43612a4b565b80355f805160206138c38339815191529081556014612b6860608401604085016138a2565b60ff161180612b875750612b8260608301604084016138a2565b60ff16155b15612bbb57612b9c60608301604084016138a2565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612bcb60608301604084016138a2565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612bfc6040830160208401613535565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fe4612a4b565b508054612c3790612f86565b5f825580601f10612c46575050565b601f0160209004905f5260205f20908101906110169190612c9f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612cb3575f8155600101612ca0565b5090565b5f60208284031215612cc7575f80fd5b5035919050565b803563ffffffff81168114612ce1575f80fd5b919050565b5f8060408385031215612cf7575f80fd5b82356001600160401b03811115612d0c575f80fd5b830160808186031215612d1d575f80fd5b9150612d2b60208401612cce565b90509250929050565b5f60208284031215612d44575f80fd5b610ab082612cce565b80356001600160401b0381168114612ce1575f80fd5b5f8060408385031215612d74575f80fd5b82356001600160401b03811115612d89575f80fd5b830160a08186031215612d9a575f80fd5b9150612d2b60208401612d4d565b6001600160a01b0381168114611016575f80fd5b5f808284036080811215612dce575f80fd5b6060811215612ddb575f80fd5b508291506060830135612ded81612da8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612e2857634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612e46578181015183820152602001612e2e565b50505f910152565b5f8151808452612e65816020860160208601612e2c565b601f01601f19169290920160200192915050565b60208152612e8b602082018351612e0c565b5f602083015160e06040840152612ea6610100840182612e4e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612f09575f80fd5b8135612f1481612da8565b9392505050565b5f8060208385031215612f2c575f80fd5b82356001600160401b0380821115612f42575f80fd5b818501915085601f830112612f55575f80fd5b813581811115612f63575f80fd5b866020828501011115612f74575f80fd5b60209290920196919550909350505050565b600181811c90821680612f9a57607f821691505b602082108103612fb857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ab38284612e0c565b602081525f610ab06020830184612e4e565b5f60208284031215612fee575f80fd5b5051919050565b5f808335601e1984360301811261300a575f80fd5b8301803591506001600160401b03821115613023575f80fd5b6020019150600581901b36038213156124cb575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613062575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130a2576130a261306c565b60405290565b604080519081016001600160401b03811182821017156130a2576130a261306c565b604051601f8201601f191681016001600160401b03811182821017156130f2576130f261306c565b604052919050565b5f6001600160401b038211156131125761311261306c565b50601f01601f191660200190565b5f82601f83011261312f575f80fd5b813561314261313d826130fa565b6130ca565b818152846020838601011115613156575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215613182575f80fd5b61318a613080565b82356001600160401b03808211156131a0575f80fd5b6131ac36838701613120565b835260208501359150808211156131c1575f80fd5b506131ce36828601613120565b6020830152506131e060408401612d4d565b604082015292915050565b5f8251613062818460208701612e2c565b601f821115610a5c57805f5260205f20601f840160051c810160208510156132215750805b601f840160051c820191505b81811015613240575f815560010161322d565b5050505050565b81516001600160401b038111156132605761326061306c565b6132748161326e8454612f86565b846131fc565b602080601f8311600181146132a7575f84156132905750858301515b5f19600386901b1c1916600185901b1785556132fe565b5f85815260208120601f198616915b828110156132d5578886015182559484019460019091019084016132b6565b50858210156132f257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ab357610ab3613306565b5f63ffffffff80831681810361334557613345613306565b6001019392505050565b8082028115828204841417610ab357610ab3613306565b5f60208083525f845461337881612f86565b806020870152604060018084165f811461339957600181146133b5576133e2565b60ff19851660408a0152604084151560051b8a010195506133e2565b895f5260205f205f5b858110156133d95781548b82018601529083019088016133be565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612ce1575f80fd5b5f806040838503121561341f575f80fd5b82516001600160401b0380821115613435575f80fd5b9084019060608287031215613448575f80fd5b613450613080565b8251815260208084015161346381612da8565b82820152604084015183811115613478575f80fd5b80850194505087601f85011261348c575f80fd5b8351925061349c61313d846130fa565b83815288828587010111156134af575f80fd5b6134be84838301848801612e2c565b806040840152508195506134d38188016133ff565b9450505050509250929050565b81810381811115610ab357610ab3613306565b5f808335601e19843603018112613508575f80fd5b8301803591506001600160401b03821115613521575f80fd5b6020019150368190038213156124cb575f80fd5b5f60208284031215613545575f80fd5b610ab082612d4d565b5f885161355f818460208d01612e2c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e19833603018112613062575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215613609575f80fd5b6136116130a8565b61361a83612cce565b81526020808401356001600160401b0380821115613636575f80fd5b9085019036601f830112613648575f80fd5b81358181111561365a5761365a61306c565b8060051b915061366b8483016130ca565b8181529183018401918481019036841115613684575f80fd5b938501935b838510156136ae578435925061369e83612da8565b8282529385019390850190613689565b94860194909452509295945050505050565b6001600160401b038281168282160390808211156111d2576111d2613306565b6001600160401b038181168382160190808211156111d2576111d2613306565b6001600160401b0381811683821602808216919082811461372357613723613306565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161377181602a850160208b01612e2c565b86519083019061378881602a840160208b01612e2c565b60c087901b6001600160c01b031916602a92909101918201526137ba603282018660e01b6001600160e01b0319169052565b6137d3603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516137f6818460208801612e2c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f845161382c818460208901612e2c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351613867818460208801612e2c565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b0380831681810361334557613345613306565b5f602082840312156138b2575f80fd5b813560ff81168114612f14575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 03c87e8f2..4cb383899 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -78,6 +78,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida error InvalidSubnetConversionID( bytes32 encodedSubnetConversionID, bytes32 expectedSubnetConversionID ); + error InvalidTotalWeight(uint256 weight); error InvalidValidationID(bytes32 validationID); error InvalidValidatorStatus(ValidatorStatus status); error InvalidWarpMessage(); @@ -197,6 +198,12 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida } $._churnTracker.totalWeight = totalWeight; + // Rearranged equation for totalWeight < (100 / $._maximumChurnPercentage) + // Total weight must be above this value in order to not trigger churn limits with an added/removed weight of 1. + if (totalWeight * $._maximumChurnPercentage < 100) { + revert InvalidTotalWeight(totalWeight); + } + // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. bytes32 subnetConversionID = ValidatorMessages.unpackSubnetConversionMessage( _getPChainWarpMessage(messageIndex).payload @@ -575,6 +582,12 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida churnTracker.totalWeight += newValidatorWeight; churnTracker.totalWeight -= oldValidatorWeight; + // Rearranged equation for totalWeight < (100 / $._maximumChurnPercentage) + // Total weight must be above this value in order to not trigger churn limits with an added/removed weight of 1. + if (churnTracker.totalWeight * $._maximumChurnPercentage < 100) { + revert InvalidTotalWeight(churnTracker.totalWeight); + } + $._churnTracker = churnTracker; } } diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index c85356bc9..986a23f93 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -11,7 +11,8 @@ import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import { ValidatorManagerSettings, - ValidatorRegistrationInput + ValidatorRegistrationInput, + IValidatorManager } from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; @@ -31,28 +32,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function setUp() public override { ValidatorManagerTest.setUp(); - // Construct the object under test - app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - token = new ExampleERC20(); - rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - rewardCalculator: rewardCalculator - }), - token - ); - validatorManager = app; - posValidatorManager = app; + _setUp(); _mockGetBlockchainID(); _mockInitializeValidatorSet(); app.initializeValidatorSet(_defaultSubnetConversionData(), 0); @@ -261,6 +241,33 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20Mintable.mint, (account, amount))); } + function _setUp() internal override returns (IValidatorManager) { + // Construct the object under test + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + token = new ExampleERC20(); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: rewardCalculator + }), + token + ); + validatorManager = app; + posValidatorManager = app; + + return app; + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return token.balanceOf(account); } diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index fd748830e..b8a7faa10 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -10,7 +10,8 @@ import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import { ValidatorManagerSettings, - ValidatorRegistrationInput + ValidatorRegistrationInput, + IValidatorManager } from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; @@ -26,26 +27,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function setUp() public override { ValidatorManagerTest.setUp(); - // Construct the object under test - app = new NativeTokenStakingManager(ICMInitializable.Allowed); - rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - rewardCalculator: rewardCalculator - }) - ); - validatorManager = app; - posValidatorManager = app; + _setUp(); _mockGetBlockchainID(); _mockInitializeValidatorSet(); app.initializeValidatorSet(_defaultSubnetConversionData(), 0); @@ -229,6 +211,30 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.deal(account, account.balance + amount); } + function _setUp() internal override returns (IValidatorManager) { + // Construct the object under test + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: rewardCalculator + }) + ); + validatorManager = app; + posValidatorManager = app; + return app; + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; } diff --git a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol index 6de971209..063bcd6f8 100644 --- a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol @@ -10,7 +10,8 @@ import {PoAValidatorManager} from "../PoAValidatorManager.sol"; import {ICMInitializable} from "@utilities/ICMInitializable.sol"; import { ValidatorManagerSettings, - ValidatorRegistrationInput + ValidatorRegistrationInput, + IValidatorManager } from "../interfaces/IValidatorManager.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; @@ -24,16 +25,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { function setUp() public override { ValidatorManagerTest.setUp(); - app = new PoAValidatorManager(ICMInitializable.Allowed); - app.initialize( - ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - address(this) - ); - validatorManager = app; + _setUp(); _mockGetBlockchainID(); _mockInitializeValidatorSet(); app.initializeValidatorSet(_defaultSubnetConversionData(), 0); @@ -73,6 +65,21 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeEndValidation(validationID); } + function _setUp() internal override returns (IValidatorManager) { + app = new PoAValidatorManager(ICMInitializable.Allowed); + app.initialize( + ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + address(this) + ); + validatorManager = app; + + return app; + } + // solhint-disable-next-line no-empty-blocks function _beforeSend(uint256 amount, address spender) internal virtual override {} } diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 6de1e94f5..8bf57d4c8 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -11,7 +11,8 @@ import {ValidatorMessages} from "../ValidatorMessages.sol"; import { ValidatorStatus, ValidatorRegistrationInput, - PChainOwner + PChainOwner, + IValidatorManager } from "../interfaces/IValidatorManager.sol"; import { WarpMessage, @@ -280,6 +281,34 @@ abstract contract ValidatorManagerTest is Test { validatorManager.completeEndValidation(0); } + function testInitialWeightsTooLow() public { + vm.prank(address(123)); + IValidatorManager manager = _setUp(); + + _mockGetBlockchainID(); + vm.expectRevert(abi.encodeWithSelector(ValidatorManager.InvalidTotalWeight.selector, 4)); + manager.initializeValidatorSet(_defaultSubnetConversionDataWeightsTooLow(), 0); + } + + function testRemoveValidatorTotalWeight5() public { + // Use prank here, because otherwise each test will end up with a different contract address, leading to a different subnet conversion hash. + vm.prank(address(123)); + IValidatorManager manager = _setUp(); + + _mockGetBlockchainID(); + _mockGetPChainWarpMessage( + ValidatorMessages.packSubnetConversionMessage( + bytes32(hex"1d72565851401e05d6351ebf5443d9bdc04953f3233da1345af126e7e4be7464") + ), + true + ); + manager.initializeValidatorSet(_defaultSubnetConversionDataTotalWeight5(), 0); + + bytes32 validationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(0))); + vm.expectRevert(abi.encodeWithSelector(ValidatorManager.InvalidTotalWeight.selector, 4)); + _forceInitializeEndValidation(validationID, false); + } + function testCumulativeChurnRegistration() public { uint64 churnThreshold = uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * DEFAULT_MAXIMUM_CHURN_PERCENTAGE / 100; @@ -556,6 +585,8 @@ abstract contract ValidatorManagerTest is Test { bool includeUptime ) internal virtual; + function _setUp() internal virtual returns (IValidatorManager); + function _beforeSend(uint256 amount, address spender) internal virtual; function _defaultSubnetConversionData() internal view returns (SubnetConversionData memory) { @@ -581,6 +612,58 @@ abstract contract ValidatorManagerTest is Test { }); } + function _defaultSubnetConversionDataWeightsTooLow() + internal + view + returns (SubnetConversionData memory) + { + InitialValidator[] memory initialValidators = new InitialValidator[](2); + + initialValidators[0] = InitialValidator({ + nodeID: DEFAULT_INITIAL_VALIDATOR_NODE_ID_1, + weight: 1, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + initialValidators[1] = InitialValidator({ + nodeID: DEFAULT_INITIAL_VALIDATOR_NODE_ID_2, + weight: 3, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + + return SubnetConversionData({ + subnetID: DEFAULT_SUBNET_ID, + validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, + validatorManagerAddress: address(validatorManager), + initialValidators: initialValidators + }); + } + + function _defaultSubnetConversionDataTotalWeight5() + internal + view + returns (SubnetConversionData memory) + { + InitialValidator[] memory initialValidators = new InitialValidator[](2); + + initialValidators[0] = InitialValidator({ + nodeID: DEFAULT_INITIAL_VALIDATOR_NODE_ID_1, + weight: 1, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + initialValidators[1] = InitialValidator({ + nodeID: DEFAULT_INITIAL_VALIDATOR_NODE_ID_2, + weight: 4, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + + return SubnetConversionData({ + subnetID: DEFAULT_SUBNET_ID, + validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, + validatorManagerAddress: address(validatorManager), + initialValidators: initialValidators + }); + } + // TODO this needs to be kept in line with the contract conversions, but we can't make external calls // to the contract and use vm.expectRevert at the same time. // These are okay to use for PoA as well, because they're just used for conversions inside the tests. From a86bf6f2e92092660d545b8f0a8818479161d199 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 08:37:02 -0400 Subject: [PATCH 02/35] Sort imports, remove duplicate imports --- .../ERC20TokenStakingManager.sol | 12 +++++----- .../NativeTokenStakingManager.sol | 8 +++---- .../validator-manager/PoAValidatorManager.sol | 10 ++++----- .../validator-manager/PoSValidatorManager.sol | 22 +++++++++---------- .../validator-manager/ValidatorManager.sol | 17 +++++++------- .../validator-manager/ValidatorMessages.sol | 2 +- 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/contracts/validator-manager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol index f4e12e8cb..b827856ce 100644 --- a/contracts/validator-manager/ERC20TokenStakingManager.sol +++ b/contracts/validator-manager/ERC20TokenStakingManager.sol @@ -5,16 +5,16 @@ pragma solidity 0.8.25; +import {PoSValidatorManager} from "./PoSValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; +import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; import {IERC20TokenStakingManager} from "./interfaces/IERC20TokenStakingManager.sol"; -import {Initializable} from - "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; import {IERC20Mintable} from "./interfaces/IERC20Mintable.sol"; +import {ICMInitializable} from "@utilities/ICMInitializable.sol"; import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.sol"; +import {Initializable} from + "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; -import {ICMInitializable} from "../utilities/ICMInitializable.sol"; -import {PoSValidatorManager} from "./PoSValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; -import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; /** * @dev Implementation of the {IERC20TokenStakingManager} interface. diff --git a/contracts/validator-manager/NativeTokenStakingManager.sol b/contracts/validator-manager/NativeTokenStakingManager.sol index bc0a80bdb..0ef1b82a2 100644 --- a/contracts/validator-manager/NativeTokenStakingManager.sol +++ b/contracts/validator-manager/NativeTokenStakingManager.sol @@ -5,16 +5,16 @@ pragma solidity 0.8.25; +import {PoSValidatorManager} from "./PoSValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; +import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; import {INativeMinter} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; +import {ICMInitializable} from "@utilities/ICMInitializable.sol"; import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; -import {ICMInitializable} from "../utilities/ICMInitializable.sol"; -import {PoSValidatorManager} from "./PoSValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; -import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; /** * @dev Implementation of the {INativeTokenStakingManager} interface. diff --git a/contracts/validator-manager/PoAValidatorManager.sol b/contracts/validator-manager/PoAValidatorManager.sol index d45a196a6..8eff638ce 100644 --- a/contracts/validator-manager/PoAValidatorManager.sol +++ b/contracts/validator-manager/PoAValidatorManager.sol @@ -5,15 +5,15 @@ pragma solidity 0.8.25; -import {IPoAValidatorManager} from "./interfaces/IPoAValidatorManager.sol"; -import {OwnableUpgradeable} from - "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; -import {ICMInitializable} from "../utilities/ICMInitializable.sol"; +import {ValidatorManager} from "./ValidatorManager.sol"; import { ValidatorManagerSettings, ValidatorRegistrationInput } from "./interfaces/IValidatorManager.sol"; -import {ValidatorManager} from "./ValidatorManager.sol"; +import {IPoAValidatorManager} from "./interfaces/IPoAValidatorManager.sol"; +import {ICMInitializable} from "@utilities/ICMInitializable.sol"; +import {OwnableUpgradeable} from + "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; /** * @dev Implementation of the {IPoAValidatorManager} interface. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 20f8f3cf6..dcfa9ed5f 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -5,23 +5,23 @@ pragma solidity 0.8.25; +import {ValidatorManager} from "./ValidatorManager.sol"; +import {ValidatorMessages} from "./ValidatorMessages.sol"; import { - IPoSValidatorManager, Delegator, DelegatorStatus + Delegator, + DelegatorStatus, + IPoSValidatorManager, + PoSValidatorInfo, + PoSValidatorManagerSettings } from "./interfaces/IPoSValidatorManager.sol"; -import { - PoSValidatorManagerSettings, PoSValidatorInfo -} from "./interfaces/IPoSValidatorManager.sol"; -import {Validator} from "./interfaces/IValidatorManager.sol"; -import {ValidatorManager} from "./ValidatorManager.sol"; import { Validator, - ValidatorStatus, - ValidatorRegistrationInput + ValidatorRegistrationInput, + ValidatorStatus } from "./interfaces/IValidatorManager.sol"; +import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; import {WarpMessage} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; -import {ValidatorMessages} from "./ValidatorMessages.sol"; -import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ReentrancyGuardUpgradeable.sol"; @@ -656,7 +656,7 @@ abstract contract PoSValidatorManager is uint256 validatorFees; uint256 delegatorRewards; if (rewards > 0) { - validatorFees = rewards * $._posValidatorInfo[validationID].delegationFeeBips / 10000; + validatorFees = (rewards * $._posValidatorInfo[validationID].delegationFeeBips) / 10000; // Allocate the delegation fees to the validator. $._redeemableValidatorRewards[validationID] += validatorFees; diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 03c87e8f2..82f0718cf 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -5,23 +5,22 @@ pragma solidity 0.8.25; +import {ValidatorMessages} from "./ValidatorMessages.sol"; import { + InitialValidator, IValidatorManager, - ValidatorManagerSettings, - ValidatorChurnPeriod, - ValidatorStatus, + PChainOwner, + SubnetConversionData, Validator, ValidatorChurnPeriod, - SubnetConversionData, - InitialValidator, + ValidatorManagerSettings, ValidatorRegistrationInput, - PChainOwner + ValidatorStatus } from "./interfaces/IValidatorManager.sol"; import { - WarpMessage, - IWarpMessenger + IWarpMessenger, + WarpMessage } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; -import {ValidatorMessages} from "./ValidatorMessages.sol"; import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ContextUpgradeable.sol"; import {Initializable} from diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 272edf795..3398cd411 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -4,7 +4,7 @@ // SPDX-License-Identifier: Ecosystem pragma solidity 0.8.25; -import {SubnetConversionData, PChainOwner} from "./interfaces/IValidatorManager.sol"; +import {PChainOwner, SubnetConversionData} from "./interfaces/IValidatorManager.sol"; /** * @dev Packing utilities for the Warp message types used by the Validator Manager contracts, as specified in ACP-77: From 646c1b8c95b4beedaa7d5ce321a3ae5e5a9b9908 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 08:43:31 -0400 Subject: [PATCH 03/35] Don't initialize variable to default value --- contracts/validator-manager/ValidatorMessages.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 272edf795..cb9322049 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -166,7 +166,7 @@ library ValidatorMessages { // The approach below of encoding initialValidators using `abi.encodePacked` in a loop // was tested against pre-allocating the array and doing manual byte by byte packing and // it was found to be more gas efficient. - for (uint256 i = 0; i < subnetConversionData.initialValidators.length; i++) { + for (uint256 i; i < subnetConversionData.initialValidators.length; i++) { res = abi.encodePacked( res, uint32(subnetConversionData.initialValidators[i].nodeID.length), @@ -238,7 +238,7 @@ library ValidatorMessages { validationPeriod.remainingBalanceOwner.threshold, uint32(validationPeriod.remainingBalanceOwner.addresses.length) ); - for (uint256 i = 0; i < validationPeriod.remainingBalanceOwner.addresses.length; i++) { + for (uint256 i; i < validationPeriod.remainingBalanceOwner.addresses.length; i++) { res = abi.encodePacked(res, validationPeriod.remainingBalanceOwner.addresses[i]); } res = abi.encodePacked( @@ -246,7 +246,7 @@ library ValidatorMessages { validationPeriod.disableOwner.threshold, uint32(validationPeriod.disableOwner.addresses.length) ); - for (uint256 i = 0; i < validationPeriod.disableOwner.addresses.length; i++) { + for (uint256 i; i < validationPeriod.disableOwner.addresses.length; i++) { res = abi.encodePacked(res, validationPeriod.disableOwner.addresses[i]); } res = abi.encodePacked(res, validationPeriod.weight); From 2179ec5707ecbd4e4c36eea356c06c49ead668b4 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 09:09:30 -0400 Subject: [PATCH 04/35] Remove magic numbers --- .../ERC20TokenStakingManager.go | 35 +++++++++++++++++-- .../ExampleRewardCalculator.go | 35 +++++++++++++++++-- .../NativeTokenStakingManager.go | 35 +++++++++++++++++-- .../ExampleRewardCalculator.sol | 4 ++- .../validator-manager/PoSValidatorManager.sol | 5 ++- 5 files changed, 106 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index c6cd32649..ae48227b4 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -90,8 +90,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f8b380380615f8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e3e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b61020961020436600461505c565b6104a8565b005b610209610219366004615097565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b36600461505c565b6106eb565b61020961025e3660046150ae565b6106f6565b6102096102713660046150fc565b610be2565b610289610284366004615097565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb36600461505c565b610c6c565b6102096102de36600461511d565b610c77565b6102f66102f136600461515d565b610d39565b604051908152602001610234565b6102096103123660046151c2565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f66103423660046151ea565b610fd9565b610289610355366004615097565b610ff2565b6102f65f81565b61020961036f36600461505c565b611006565b610226603081565b61020961038a366004615097565b611031565b61020961039d3660046151c2565b6110fc565b6102f66103b0366004615203565b6112d4565b6102096103c336600461511d565b611300565b6102f65f80516020615db283398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004615097565b611489565b6102f65f80516020615dd283398151915281565b610209610437366004615097565b611672565b610226601481565b610457610452366004615097565b6117af565b6040516102349190615298565b6102896202a30081565b6102f65f80516020615d9283398151915281565b61020961049036600461532c565b6118fe565b6102f66104a336600461536a565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff16600581111561052a5761052a615223565b600581111561053b5761053b615223565b815260200160018201805461054f906153d5565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906153d5565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063157610631615223565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d46565b6040518263ffffffff1660e01b81526004016106a5919061541b565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e5919061542d565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615dd28339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af919061542d565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e96060850160408601615444565b6001600160a01b03161461082c576108076060840160408501615444565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a606085018561545f565b905090505f805b828163ffffffff161015610b22575f61085d606088018861545f565b8363ffffffff16818110610873576108736154a4565b905060200281019061088591906154b8565b61088e906155dc565b80516040519192505f9160088801916108a691615655565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf919060040161541b565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f91615655565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d919061542d565b90508086600801835f01516040516109759190615655565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f7615223565b021790555060208201516001820190610a1090826156aa565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab5911685615779565b8251604051919550610ac691615655565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b9061578c565b9050610841565b50600483018190555f610b40610b3786611d95565b60400151611eab565b90505f610b4c87612038565b90505f600282604051610b5f9190615655565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d919061542d565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612212565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c615223565b14610c4c578060405163170cc93360e21b81526004016104cf919061540d565b6106e5838361224d565b5f610c6664e8d4a51000836157ae565b92915050565b6106e58383836124c7565b610c7f6126c0565b5f80516020615db28339815191525f80610c98846126f7565b91509150610ca582612212565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce0615223565b03610d05575f83815260078501602052604081208054919055610d038282612a35565b505b610d1b81610d168460400151610fd9565b612aab565b505050505b610d3660015f80516020615df283398151915255565b50565b5f610d426126c0565b610d4e85858585612ae1565b9050610d6660015f80516020615df283398151915255565b949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115610dbb57610dbb615223565b6003811115610dcc57610dcc615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e59615223565b14610e7a578251604051633b0d540d60e21b81526104cf91906004016157cd565b600481516005811115610e8f57610e8f615223565b03610ea557610e9d85612cba565b505050505050565b5f80610ebc610eb389611d95565b60400151612ea1565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a510006157e7565b5f610ffc826117af565b6080015192915050565b6110118383836124c7565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615db28339815191525f611049836117af565b519050600481600581111561106057611060615223565b14611080578060405163170cc93360e21b81526004016104cf919061540d565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a35565b6111046126c0565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff16600381111561115157611151615223565b600381111561116257611162615223565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db615223565b146111fc578051604051633b0d540d60e21b81526104cf91906004016157cd565b600461120b82604001516117af565b51600581111561121d5761121d615223565b146112af575f61122c85611d95565b90505f8061123d8360400151612ea1565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612cba565b50506112d060015f80516020615df283398151915255565b5050565b5f6112dd6126c0565b6112e88333846130f7565b9050610c6660015f80516020615df283398151915255565b5f80516020615dd28339815191525f8061132561131c85611d95565b604001516133cf565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f82815260068401602052604090208054611365906153d5565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af615223565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068401602052604081206113fa91614fab565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff1660038111156114d6576114d6615223565b60038111156114e7576114e7615223565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561156057611560615223565b14158015611581575060038151600381111561157e5761157e615223565b14155b156115a2578051604051633b0d540d60e21b81526104cf91906004016157cd565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d46565b6040518263ffffffff1660e01b815260040161162b919061541b565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b919061542d565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615dd283398151915291906116b9906153d5565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff16600581111561170357611703615223565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016157fe565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d8919061542d565b6117b7614fe2565b5f8281525f80516020615e12833981519152602052604090819020815160e0810190925280545f80516020615dd2833981519152929190829060ff16600581111561180457611804615223565b600581111561181557611815615223565b8152602001600182018054611829906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611855906153d5565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611990848461358b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615dd2833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615888565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db28339815191529284929091829060ff166003811115611a8657611a86615223565b6003811115611a9757611a97615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b24615223565b14611b45578251604051633b0d540d60e21b81526104cf91906004016157cd565b60208301516001600160a01b03163314611be8575f828152600485016020526040902054336001600160a01b0390911603611be2575f82815260048501602052604090205460a0820151611ba991600160b01b90046001600160401b031690615897565b6001600160401b0316421015611bdd5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b611be8565b336110a1565b600281516005811115611bfd57611bfd615223565b03611cda578615611c1457611c12828761224d565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c4d918491611c4891906158b7565b6135a5565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c8e846136fc565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d3f9350505050565b600481516005811115611cef57611cef615223565b03611d2357611cfd836136fc565b5f898152600686016020526040902055611d1688612cba565b6001945050505050611d3f565b805160405163170cc93360e21b81526104cf919060040161540d565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e2091908101906158e2565b9150915080611e4257604051636b2f19e960e01b815260040160405180910390fd5b815115611e68578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611ea4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611ee057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f2f57611ef78160016159b4565b611f029060086157e7565b61ffff16848281518110611f1857611f186154a4565b016020015160f81c901b9190911790600101611ee3565b5061ffff811615611f595760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611fb457611f708160036159b4565b611f7b9060086157e7565b63ffffffff1685611f8d836002615779565b81518110611f9d57611f9d6154a4565b016020015160f81c901b9190911790600101611f5c565b5063ffffffff811615611fda57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561202f57611ff181601f6159b4565b611ffc9060086157e7565b86612008836006615779565b81518110612018576120186154a4565b016020015160f81c901b9190911790600101611fdd565b50949350505050565b60605f8083356020850135601461205487870160408901615444565b612061606089018961545f565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6120e7606085018561545f565b9050811015611ea457816120fe606086018661545f565b8381811061210e5761210e6154a4565b905060200281019061212091906154b8565b61212a90806159c7565b9050612139606087018761545f565b84818110612149576121496154a4565b905060200281019061215b91906154b8565b61216590806159c7565b612172606089018961545f565b86818110612182576121826154a4565b905060200281019061219491906154b8565b6121a29060208101906159c7565b6121af60608b018b61545f565b888181106121bf576121bf6154a4565b90506020028101906121d191906154b8565b6121e29060608101906040016151ea565b6040516020016121f89796959493929190615a09565b60408051601f1981840301815291905291506001016120da565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612298573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122bf91908101906158e2565b91509150806122e157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612324573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612348919061542d565b82511461236e578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123aa576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f806123b984604001516138a8565b915091508187146123e05760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615db2833981519152906001600160401b03908116908316111561249d575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26124bc565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615db2833981519152816124e086613a99565b90506124eb86612212565b6124fa57600192505050611d3f565b5f8681526004830160205260409020546001600160a01b0316331461251f57336110a1565b5f86815260048301602052604090205460a082015161254e91600160b01b90046001600160401b031690615897565b6001600160401b03168160c001516001600160401b031610156125955760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125ad576125a6878661224d565b90506125cb565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906125f090610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268a919061542d565b905080846007015f8a81526020019081526020015f205f8282546126ae9190615779565b90915550501515979650505050505050565b5f80516020615df28339815191528054600119016126f157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612700614fe2565b5f80516020615dd28339815191525f8061271c61131c87611d95565b91509150801561274357604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561277457612774615223565b600581111561278557612785615223565b8152602001600182018054612799906153d5565b80601f01602080910402602001604051908101604052809291908181526020018280546127c5906153d5565b80156128105780601f106127e757610100808354040283529160200191612810565b820191905f5260205f20905b8154815290600101906020018083116127f357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561287b5761287b615223565b1415801561289c575060018151600581111561289957612899615223565b14155b156128bd57805160405163170cc93360e21b81526104cf919060040161540d565b6003815160058111156128d2576128d2615223565b036128e057600481526128e5565b600581525b8360080181602001516040516128fb9190615655565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561293f5761293f615223565b02179055506020820151600182019061295890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129fe576129fe615223565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a90575f80fd5b505af1158015612aa2573d5f803e3d5ffd5b50505050505050565b5f80516020615d92833981519152546112d0906001600160a01b03168383613d7d565b60015f80516020615df283398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615db283398151915290600160401b900461ffff9081169086161080612b35575061271061ffff8616115b15612b5957604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b95576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612ba75750806001015483115b15612bc85760405163222d164360e21b8152600481018490526024016104cf565b5f612bd284613ddc565b90505f612bde82610c56565b90505f612beb8983613dff565b90506040518060800160405280612bff3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115612d0757612d07615223565b6003811115612d1857612d18615223565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e46575f84815260048701602052604090205461271090612df890600160a01b900461ffff16856157e7565b612e0291906157ae565b915081866007015f8681526020019081526020015f205f828254612e269190615779565b90915550612e36905082846159b4565b9050612e46856020015182612a35565b612e5b8560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ed857835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f2757612eef8160016159b4565b612efa9060086157e7565b61ffff16868281518110612f1057612f106154a4565b016020015160f81c901b9190911790600101612edb565b5061ffff811615612f515760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612fac57612f688160036159b4565b612f739060086157e7565b63ffffffff1687612f85836002615779565b81518110612f9557612f956154a4565b016020015160f81c901b9190911790600101612f54565b5063ffffffff8116600314612fd457604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561302957612feb81601f6159b4565b612ff69060086157e7565b88613002836006615779565b81518110613012576130126154a4565b016020015160f81c901b9190911790600101612fd7565b505f805b6008811015613088576130418160076159b4565b61304c9060086157e7565b6001600160401b031689613061836026615779565b81518110613071576130716154a4565b016020015160f81c901b919091179060010161302d565b505f805b60088110156130e7576130a08160076159b4565b6130ab9060086157e7565b6001600160401b03168a6130c083602e615779565b815181106130d0576130d06154a4565b016020015160f81c901b919091179060010161308c565b5091989097509095509350505050565b5f5f80516020615db28339815191528161311361028485613ddc565b90505f61311f876117af565b905061312a87612212565b61314a576040516330efa98b60e01b8152600481018890526024016104cf565b60028151600581111561315f5761315f615223565b1461318057805160405163170cc93360e21b81526104cf919060040161540d565b5f8282608001516131919190615897565b905083600201600a9054906101000a90046001600160401b031682604001516131ba9190615a72565b6001600160401b0316816001600160401b031611156131f757604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806132038a846135a5565b915091505f8a8360405160200161323192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132c4576132c4615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461340557825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156134545761341c8160016159b4565b6134279060086157e7565b61ffff1685828151811061343d5761343d6154a4565b016020015160f81c901b9190911790600101613408565b5061ffff81161561347e5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134d9576134958160036159b4565b6134a09060086157e7565b63ffffffff16866134b2836002615779565b815181106134c2576134c26154a4565b016020015160f81c901b9190911790600101613481565b5063ffffffff811660021461350157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135565761351881601f6159b4565b6135239060086157e7565b8761352f836006615779565b8151811061353f5761353f6154a4565b016020015160f81c901b9190911790600101613504565b505f8660268151811061356b5761356b6154a4565b016020015191976001600160f81b03199092161515965090945050505050565b613593614377565b61359c826143c2565b6112d081614430565b5f8281525f80516020615e12833981519152602052604081206002015481905f80516020615dd283398151915290600160801b90046001600160401b03166135ed8582614498565b5f6135f787614672565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136478a858b611d46565b6040518263ffffffff1660e01b8152600401613663919061541b565b6020604051808303815f875af115801561367f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a3919061542d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615db283398151915290505f61371c84604001516117af565b90505f60038251600581111561373457613734615223565b1480613752575060048251600581111561375057613750615223565b145b15613762575060c081015161379f565b60028251600581111561377757613777615223565b0361378357504261379f565b815160405163170cc93360e21b81526104cf919060040161540d565b84608001516001600160401b0316816001600160401b0316116137c657505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137eb90610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561387b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061389f919061542d565b95945050505050565b5f808251602e146138de57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b600281101561392d576138f58160016159b4565b6139009060086157e7565b61ffff16858281518110613916576139166154a4565b016020015160f81c901b91909117906001016138e1565b5061ffff8116156139575760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139b25761396e8160036159b4565b6139799060086157e7565b63ffffffff168661398b836002615779565b8151811061399b5761399b6154a4565b016020015160f81c901b919091179060010161395a565b5063ffffffff8116156139d857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a2d576139ef81601f6159b4565b6139fa9060086157e7565b87613a06836006615779565b81518110613a1657613a166154a4565b016020015160f81c901b91909117906001016139db565b505f805b6008811015613a8c57613a458160076159b4565b613a509060086157e7565b6001600160401b031688613a65836026615779565b81518110613a7557613a756154a4565b016020015160f81c901b9190911790600101613a31565b5090969095509350505050565b613aa1614fe2565b5f8281525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff166005811115613aee57613aee615223565b6005811115613aff57613aff615223565b8152602001600182018054613b13906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054613b3f906153d5565b8015613b8a5780601f10613b6157610100808354040283529160200191613b8a565b820191905f5260205f20905b815481529060010190602001808311613b6d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613bf857613bf8615223565b14613c2b575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c6f57613c6f615223565b021790555060208201516001820190613c8890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d2685826135a5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146e7565b5f610c66825f80516020615d92833981519152546001600160a01b031690614748565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e4357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615dd283398151915242613e6260608601604087016151ea565b6001600160401b0316111580613e9c5750613e806202a30042615779565b613e9060608601604087016151ea565b6001600160401b031610155b15613ed657613eb160608501604086016151ea565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613eeb613ee66060860186615a9d565b6148a1565b613efb613ee66080860186615a9d565b6030613f0a60208601866159c7565b905014613f3c57613f1e60208501856159c7565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f4684806159c7565b90505f03613f7357613f5884806159c7565b604051633e08a12560e11b81526004016104cf929190615ab1565b5f60088201613f8286806159c7565b604051613f90929190615888565b90815260200160405180910390205414613fc957613fae84806159c7565b60405163a41f772f60e01b81526004016104cf929190615ab1565b613fd3835f614498565b6040805160e08101909152815481525f9081906140df9060208101613ff889806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614040908a018a6159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161408960608a0160408b016151ea565b6001600160401b031681526020016140a460608a018a615a9d565b6140ad90615adf565b81526020016140bf60808a018a615a9d565b6140c890615adf565b8152602001876001600160401b0316815250614a0a565b5f828152600686016020526040902091935091506140fd82826156aa565b50816008840161410d88806159c7565b60405161411b929190615888565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061415790859060040161541b565b6020604051808303815f875af1158015614173573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614197919061542d565b6040805160e0810190915290915080600181526020016141b789806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561424657614246615223565b02179055506020820151600182019061425f90826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806142fd88806159c7565b60405161430b929190615888565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061434991906151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143c057604051631afcd79f60e31b815260040160405180910390fd5b565b6143ca614377565b6143d381614bf7565b6143db614c10565b610d36606082013560808301356143f860c0850160a086016151ea565b61440860e0860160c08701615ba6565b614419610100870160e08801615bbf565b61442b61012088016101008901615444565b614c20565b614438614377565b5f80516020615d928339815191526001600160a01b03821661447857604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615dd28339815191525f6001600160401b0380841690851611156144cc576144c583856158b7565b90506144d9565b6144d684846158b7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061453b575060018401548151614537916001600160401b031690615779565b8210155b15614561576001600160401b038316606082015281815260408101516020820152614580565b82816060018181516145739190615897565b6001600160401b03169052505b6060810151614590906064615a72565b602082015160018601546001600160401b0392909216916145bb9190600160401b900460ff166157e7565b10156145eb57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516146069190615779565b9052506040810180516001600160401b03871691906146269083906159b4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615e128339815191526020526040812060020180545f80516020615dd283398151915291906008906146bc90600160401b90046001600160401b0316615bdf565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146fb6001600160a01b03841683614d4f565b905080515f1415801561471f57508080602001905181019061471d9190615bfa565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561478e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147b2919061542d565b90506147c96001600160a01b038516333086614d5c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561480d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614831919061542d565b90508181116148975760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b61389f82826159b4565b6148ae602082018261511d565b63ffffffff161580156148ce57506148c9602082018261545f565b151590505b15614915576148e0602082018261511d565b6148ed602083018361545f565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b614922602082018261545f565b9050614931602083018361511d565b63ffffffff16111561494a576148e0602082018261511d565b60015b61495a602083018361545f565b90508110156112d057614970602083018361545f565b61497b6001846159b4565b81811061498a5761498a6154a4565b905060200201602081019061499f9190615444565b6001600160a01b03166149b5602084018461545f565b838181106149c5576149c56154a4565b90506020020160208101906149da9190615444565b6001600160a01b03161015614a0257604051630dbc8d5f60e31b815260040160405180910390fd5b60010161494d565b5f6060826040015151603014614a335760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a74988a986001989297929690959094909390929101615c15565b60405160208183030381529060405290505f5b84608001516020015151811015614ae657818560800151602001518281518110614ab357614ab36154a4565b6020026020010151604051602001614acc929190615ccf565b60408051601f198184030181529190529150600101614a87565b5060a0840151805160209182015151604051614b06938593929101615d05565b60405160208183030381529060405290505f5b8460a001516020015151811015614b7857818560a00151602001518281518110614b4557614b456154a4565b6020026020010151604051602001614b5e929190615ccf565b60408051601f198184030181529190529150600101614b19565b5060c0840151604051614b8f918391602001615d40565b6040516020818303038152906040529050600281604051614bb09190615655565b602060405180830381855afa158015614bcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bee919061542d565b94909350915050565b614bff614377565b614c07614d95565b610d3681614d9d565b614c18614377565b6143c0614e85565b614c28614377565b5f80516020615db283398151915261ffff84161580614c4c575061271061ffff8516115b15614c7057604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c945760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614ca75750600a60ff8416115b15614cca5760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d3f83835f614e8d565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613daa565b6143c0614377565b614da5614377565b80355f80516020615dd28339815191529081556014614dca6060840160408501615bbf565b60ff161180614de95750614de46060830160408401615bbf565b60ff16155b15614e1d57614dfe6060830160408401615bbf565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614e2d6060830160408401615bbf565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e5e60408301602084016151ea565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ace614377565b606081471015614eb25760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614ecd9190615655565b5f6040518083038185875af1925050503d805f8114614f07576040519150601f19603f3d011682016040523d82523d5f602084013e614f0c565b606091505b5091509150614f1c868383614f26565b9695505050505050565b606082614f3b57614f3682614f82565b611d3f565b8151158015614f5257506001600160a01b0384163b155b15614f7b57604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d3f565b805115614f925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614fb7906153d5565b5f825580601f10614fc6575050565b601f0160209004905f5260205f2090810190610d36919061501f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615033575f8155600101615020565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114615057575f80fd5b919050565b5f805f6060848603121561506e575f80fd5b83359250602084013561508081615037565b915061508e60408501615044565b90509250925092565b5f602082840312156150a7575f80fd5b5035919050565b5f80604083850312156150bf575f80fd5b82356001600160401b038111156150d4575f80fd5b8301608081860312156150e5575f80fd5b91506150f360208401615044565b90509250929050565b5f806040838503121561510d575f80fd5b823591506150f360208401615044565b5f6020828403121561512d575f80fd5b611d3f82615044565b803561ffff81168114615057575f80fd5b80356001600160401b0381168114615057575f80fd5b5f805f8060808587031215615170575f80fd5b84356001600160401b03811115615185575f80fd5b850160a08188031215615196575f80fd5b93506151a460208601615136565b92506151b260408601615147565b9396929550929360600135925050565b5f80604083850312156151d3575f80fd5b6151dc83615044565b946020939093013593505050565b5f602082840312156151fa575f80fd5b611d3f82615147565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061524757615247615223565b9052565b5f5b8381101561526557818101518382015260200161524d565b50505f910152565b5f815180845261528481602086016020860161524b565b601f01601f19169290920160200192915050565b602081526152aa602082018351615237565b5f602083015160e060408401526152c561010084018261526d565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f8082840361014081121561533f575f80fd5b6101208082121561534e575f80fd5b849350830135905061535f81615318565b809150509250929050565b5f806020838503121561537b575f80fd5b82356001600160401b0380821115615391575f80fd5b818501915085601f8301126153a4575f80fd5b8135818111156153b2575f80fd5b8660208285010111156153c3575f80fd5b60209290920196919550909350505050565b600181811c908216806153e957607f821691505b60208210810361540757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c668284615237565b602081525f611d3f602083018461526d565b5f6020828403121561543d575f80fd5b5051919050565b5f60208284031215615454575f80fd5b8135611d3f81615318565b5f808335601e19843603018112615474575f80fd5b8301803591506001600160401b0382111561548d575f80fd5b6020019150600581901b36038213156136f5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154cc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561550c5761550c6154d6565b60405290565b604080519081016001600160401b038111828210171561550c5761550c6154d6565b604051601f8201601f191681016001600160401b038111828210171561555c5761555c6154d6565b604052919050565b5f6001600160401b0382111561557c5761557c6154d6565b50601f01601f191660200190565b5f82601f830112615599575f80fd5b81356155ac6155a782615564565b615534565b8181528460208386010111156155c0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155ec575f80fd5b6155f46154ea565b82356001600160401b038082111561560a575f80fd5b6156163683870161558a565b8352602085013591508082111561562b575f80fd5b506156383682860161558a565b60208301525061564a60408401615147565b604082015292915050565b5f82516154cc81846020870161524b565b601f8211156104d857805f5260205f20601f840160051c8101602085101561568b5750805b601f840160051c820191505b8181101561166b575f8155600101615697565b81516001600160401b038111156156c3576156c36154d6565b6156d7816156d184546153d5565b84615666565b602080601f83116001811461570a575f84156156f35750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561573857888601518255948401946001909101908401615719565b508582101561575557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c66615765565b5f63ffffffff8083168181036157a4576157a4615765565b6001019392505050565b5f826157c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157e1576157e1615223565b91905290565b8082028115828204841417610c6657610c66615765565b5f60208083525f8454615810816153d5565b806020870152604060018084165f8114615831576001811461584d5761587a565b60ff19851660408a0152604084151560051b8a0101955061587a565b895f5260205f205f5b858110156158715781548b8201860152908301908801615856565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611ea457611ea4615765565b6001600160401b03828116828216039080821115611ea457611ea4615765565b805161505781615037565b5f80604083850312156158f3575f80fd5b82516001600160401b0380821115615909575f80fd5b908401906060828703121561591c575f80fd5b6159246154ea565b8251815260208084015161593781615318565b8282015260408401518381111561594c575f80fd5b80850194505087601f850112615960575f80fd5b835192506159706155a784615564565b8381528882858701011115615983575f80fd5b6159928483830184880161524b565b806040840152508195506159a78188016158d7565b9450505050509250929050565b81810381811115610c6657610c66615765565b5f808335601e198436030181126159dc575f80fd5b8301803591506001600160401b038211156159f5575f80fd5b6020019150368190038213156136f5575f80fd5b5f8851615a1a818460208d0161524b565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615a9557615a95615765565b505092915050565b5f8235603e198336030181126154cc575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615aef575f80fd5b615af7615512565b615b0083615044565b81526020808401356001600160401b0380821115615b1c575f80fd5b9085019036601f830112615b2e575f80fd5b813581811115615b4057615b406154d6565b8060051b9150615b51848301615534565b8181529183018401918481019036841115615b6a575f80fd5b938501935b83851015615b945784359250615b8483615318565b8282529385019390850190615b6f565b94860194909452509295945050505050565b5f60208284031215615bb6575f80fd5b611d3f82615136565b5f60208284031215615bcf575f80fd5b813560ff81168114611d3f575f80fd5b5f6001600160401b038083168181036157a4576157a4615765565b5f60208284031215615c0a575f80fd5b8151611d3f81615037565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615c5b81602a850160208b0161524b565b865190830190615c7281602a840160208b0161524b565b60c087901b6001600160c01b031916602a9290910191820152615ca4603282018660e01b6001600160e01b0319169052565b615cbd603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ce081846020880161524b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615d1681846020890161524b565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615d5181846020880161524b565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615f96380380615f9683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e498061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f09969ae1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615067565b6104b3565b005b6102146102243660046150a2565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615067565b6106f6565b6102146102693660046150b9565b610701565b61021461027c366004615107565b610bed565b61029461028f3660046150a2565b610c61565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615067565b610c77565b6102146102e9366004615128565b610c82565b6103016102fc366004615168565b610d44565b60405190815260200161023f565b61021461031d3660046151cd565b610d79565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d3660046151f5565b610fe4565b6102946103603660046150a2565b610ffd565b6103015f81565b61021461037a366004615067565b611011565b610231603081565b6102146103953660046150a2565b61103c565b6102146103a83660046151cd565b611107565b6103016103bb36600461520e565b6112df565b6102146103ce366004615128565b61130b565b6103015f80516020615dbd83398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b3660046150a2565b611494565b6103015f80516020615ddd83398151915281565b6102146104423660046150a2565b61167d565b610231601481565b61046261045d3660046150a2565b6117ba565b60405161023f91906152a3565b6102946202a30081565b6103015f80516020615d9d83398151915281565b61021461049b366004615337565b611909565b6103016104ae366004615375565b6119e8565b6104be838383611a43565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615e1d8339815191526020526040808220815160e0810190925280545f80516020615ddd83398151915293929190829060ff1660058111156105355761053561522e565b60058111156105465761054661522e565b815260200160018201805461055a906153e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906153e0565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c61522e565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615418565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611d51565b6040518263ffffffff1660e01b81526004016106b09190615426565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f09190615438565b50505050565b6106f0838383611a43565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615ddd8339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190615438565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f4606085016040860161544f565b6001600160a01b03161461083757610812606084016040850161544f565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f610845606085018561546a565b905090505f805b828163ffffffff161015610b2d575f610868606088018861546a565b8363ffffffff1681811061087e5761087e6154af565b905060200281019061089091906154c3565b610899906155e7565b80516040519192505f9160088801916108b191615660565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da9190600401615426565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615660565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109689190615438565b90508086600801835f01516040516109809190615660565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a0261522e565b021790555060208201516001820190610a1b90826156b5565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac0911685615784565b8251604051919550610ad191615660565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615797565b905061084c565b50600483018190555f610b4b610b4286611da0565b60400151611eb6565b90505f610b5787612043565b90505f600282604051610b6a9190615660565b602060405180830381855afa158015610b85573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ba89190615438565b9050828114610bd457604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610bf68261221d565b610c16576040516330efa98b60e01b8152600481018390526024016104da565b5f610c20836117ba565b5190506002816005811115610c3757610c3761522e565b14610c57578060405163170cc93360e21b81526004016104da9190615418565b6106f08383612258565b5f610c7164e8d4a51000836157b9565b92915050565b6106f08383836124d2565b610c8a6126cb565b5f80516020615dbd8339815191525f80610ca384612702565b91509150610cb08261221d565b610cbc57505050610d2b565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ceb57610ceb61522e565b03610d10575f83815260078501602052604081208054919055610d0e8282612a40565b505b610d2681610d218460400151610fe4565b612ab6565b505050505b610d4160015f80516020615dfd83398151915255565b50565b5f610d4d6126cb565b610d5985858585612aec565b9050610d7160015f80516020615dfd83398151915255565b949350505050565b5f8181525f80516020615d7d8339815191526020526040808220815160e0810190925280545f80516020615dbd83398151915293929190829060ff166003811115610dc657610dc661522e565b6003811115610dd757610dd761522e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e4d826117ba565b9050600183516003811115610e6457610e6461522e565b14610e85578251604051633b0d540d60e21b81526104da91906004016157d8565b600481516005811115610e9a57610e9a61522e565b03610eb057610ea885612cc5565b505050505050565b5f80610ec7610ebe89611da0565b60400151612eac565b5091509150818414610ef457846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610f2d5750806001600160401b03168560a001516001600160401b0316115b15610f5657604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c716001600160401b03831664e8d4a510006157f2565b5f611007826117ba565b6080015192915050565b61101c8383836124d2565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615dbd8339815191525f611054836117ba565b519050600481600581111561106b5761106b61522e565b1461108b578060405163170cc93360e21b81526004016104da9190615418565b5f8381526004830160205260409020546001600160a01b031633146110d157335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600783016020908152604080832080549084905560048601909252909120546106f0906001600160a01b031682612a40565b61110f6126cb565b5f8181525f80516020615d7d8339815191526020526040808220815160e0810190925280545f80516020615dbd83398151915293929190829060ff16600381111561115c5761115c61522e565b600381111561116d5761116d61522e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111e6576111e661522e565b14611207578051604051633b0d540d60e21b81526104da91906004016157d8565b600461121682604001516117ba565b5160058111156112285761122861522e565b146112ba575f61123785611da0565b90505f806112488360400151612eac565b5091509150818460400151146112745760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b031611156112b657604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b6112c383612cc5565b50506112db60015f80516020615dfd83398151915255565b5050565b5f6112e86126cb565b6112f3833384613102565b9050610c7160015f80516020615dfd83398151915255565b5f80516020615ddd8339815191525f8061133061132785611da0565b604001516133da565b915091508061135657604051632d07135360e01b815281151560048201526024016104da565b5f82815260068401602052604090208054611370906153e0565b90505f036113945760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff1660058111156113ba576113ba61522e565b146113ed575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615418565b5f828152600684016020526040812061140591614fb6565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615d7d8339815191526020526040808220815160e0810190925280545f80516020615dbd83398151915293929190829060ff1660038111156114e1576114e161522e565b60038111156114f2576114f261522e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561156b5761156b61522e565b1415801561158c57506003815160038111156115895761158961522e565b14155b156115ad578051604051633b0d540d60e21b81526104da91906004016157d8565b5f6115bb82604001516117ba565b905080606001516001600160401b03165f036115ed576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb61161a846040015184606001518560800151611d51565b6040518263ffffffff1660e01b81526004016116369190615426565b6020604051808303815f875af1158015611652573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116769190615438565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615ddd83398151915291906116c4906153e0565b90505f036116e85760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff16600581111561170e5761170e61522e565b14611741575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615418565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161177a9190600401615809565b6020604051808303815f875af1158015611796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190615438565b6117c2614fed565b5f8281525f80516020615e1d833981519152602052604090819020815160e0810190925280545f80516020615ddd833981519152929190829060ff16600581111561180f5761180f61522e565b60058111156118205761182061522e565b8152602001600182018054611834906153e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611860906153e0565b80156118ab5780601f10611882576101008083540402835291602001916118ab565b820191905f5260205f20905b81548152906001019060200180831161188e57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611952575080546001600160401b03808416911610155b156119705760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561199b8484613596565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615ddd833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a2b9086908690615893565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d7d8339815191526020526040808220815160e0810190925280545f80516020615dbd8339815191529284929091829060ff166003811115611a9157611a9161522e565b6003811115611aa257611aa261522e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b18826117ba565b9050600283516003811115611b2f57611b2f61522e565b14611b50578251604051633b0d540d60e21b81526104da91906004016157d8565b60208301516001600160a01b03163314611bf3575f828152600485016020526040902054336001600160a01b0390911603611bed575f82815260048501602052604090205460a0820151611bb491600160b01b90046001600160401b0316906158a2565b6001600160401b0316421015611be85760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611bf3565b336110ac565b600281516005811115611c0857611c0861522e565b03611ce5578615611c1f57611c1d8287612258565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c58918491611c5391906158c2565b6135b0565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c9984613707565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d4a9350505050565b600481516005811115611cfa57611cfa61522e565b03611d2e57611d0883613707565b5f898152600686016020526040902055611d2188612cc5565b6001945050505050611d4a565b805160405163170cc93360e21b81526104da9190600401615418565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e04573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e2b91908101906158ed565b9150915080611e4d57604051636b2f19e960e01b815260040160405180910390fd5b815115611e73578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611eaf576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611eeb57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b6002811015611f3a57611f028160016159bf565b611f0d9060086157f2565b61ffff16848281518110611f2357611f236154af565b016020015160f81c901b9190911790600101611eee565b5061ffff811615611f645760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015611fbf57611f7b8160036159bf565b611f869060086157f2565b63ffffffff1685611f98836002615784565b81518110611fa857611fa86154af565b016020015160f81c901b9190911790600101611f67565b5063ffffffff811615611fe557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561203a57611ffc81601f6159bf565b6120079060086157f2565b86612013836006615784565b81518110612023576120236154af565b016020015160f81c901b9190911790600101611fe8565b50949350505050565b60605f8083356020850135601461205f8787016040890161544f565b61206c606089018961546a565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6120f2606085018561546a565b9050811015611eaf5781612109606086018661546a565b83818110612119576121196154af565b905060200281019061212b91906154c3565b61213590806159d2565b9050612144606087018761546a565b84818110612154576121546154af565b905060200281019061216691906154c3565b61217090806159d2565b61217d606089018961546a565b8681811061218d5761218d6154af565b905060200281019061219f91906154c3565b6121ad9060208101906159d2565b6121ba60608b018b61546a565b888181106121ca576121ca6154af565b90506020028101906121dc91906154c3565b6121ed9060608101906040016151f5565b6040516020016122039796959493929190615a14565b60408051601f1981840301815291905291506001016120e5565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122a3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122ca91908101906158ed565b91509150806122ec57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561232f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123539190615438565b825114612379578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b0316156123b5576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f806123c484604001516138b3565b915091508187146123eb5760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615dbd833981519152906001600160401b0390811690831611156124a8575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26124c7565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615dbd833981519152816124eb86613aa4565b90506124f68661221d565b61250557600192505050611d4a565b5f8681526004830160205260409020546001600160a01b0316331461252a57336110ac565b5f86815260048301602052604090205460a082015161255991600160b01b90046001600160401b0316906158a2565b6001600160401b03168160c001516001600160401b031610156125a05760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156125b8576125b18786612258565b90506125d6565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906125fb90610fe4565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612671573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126959190615438565b905080846007015f8a81526020019081526020015f205f8282546126b99190615784565b90915550501515979650505050505050565b5f80516020615dfd8339815191528054600119016126fc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61270b614fed565b5f80516020615ddd8339815191525f8061272761132787611da0565b91509150801561274e57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561277f5761277f61522e565b60058111156127905761279061522e565b81526020016001820180546127a4906153e0565b80601f01602080910402602001604051908101604052809291908181526020018280546127d0906153e0565b801561281b5780601f106127f25761010080835404028352916020019161281b565b820191905f5260205f20905b8154815290600101906020018083116127fe57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128865761288661522e565b141580156128a757506001815160058111156128a4576128a461522e565b14155b156128c857805160405163170cc93360e21b81526104da9190600401615418565b6003815160058111156128dd576128dd61522e565b036128eb57600481526128f0565b600581525b8360080181602001516040516129069190615660565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561294a5761294a61522e565b02179055506020820151600182019061296390826156b5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a0957612a0961522e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d9d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a9b575f80fd5b505af1158015612aad573d5f803e3d5ffd5b50505050505050565b5f80516020615d9d833981519152546112db906001600160a01b03168383613d88565b60015f80516020615dfd83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615dbd83398151915290600160401b900461ffff9081169086161080612b40575061271061ffff8616115b15612b6457604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612ba0576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612bb25750806001015483115b15612bd35760405163222d164360e21b8152600481018490526024016104da565b5f612bdd84613de7565b90505f612be982610c61565b90505f612bf68983613e0a565b90506040518060800160405280612c0a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615d7d8339815191526020526040808220815160e0810190925280545f80516020615dbd83398151915293929190829060ff166003811115612d1257612d1261522e565b6003811115612d2357612d2361522e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e51575f84815260048701602052604090205461271090612e0390600160a01b900461ffff16856157f2565b612e0d91906157b9565b915081866007015f8681526020019081526020015f205f828254612e319190615784565b90915550612e41905082846159bf565b9050612e51856020015182612a40565b612e668560200151610d218760600151610fe4565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ee357835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612f3257612efa8160016159bf565b612f059060086157f2565b61ffff16868281518110612f1b57612f1b6154af565b016020015160f81c901b9190911790600101612ee6565b5061ffff811615612f5c5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015612fb757612f738160036159bf565b612f7e9060086157f2565b63ffffffff1687612f90836002615784565b81518110612fa057612fa06154af565b016020015160f81c901b9190911790600101612f5f565b5063ffffffff8116600314612fdf57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561303457612ff681601f6159bf565b6130019060086157f2565b8861300d836006615784565b8151811061301d5761301d6154af565b016020015160f81c901b9190911790600101612fe2565b505f805b60088110156130935761304c8160076159bf565b6130579060086157f2565b6001600160401b03168961306c836026615784565b8151811061307c5761307c6154af565b016020015160f81c901b9190911790600101613038565b505f805b60088110156130f2576130ab8160076159bf565b6130b69060086157f2565b6001600160401b03168a6130cb83602e615784565b815181106130db576130db6154af565b016020015160f81c901b9190911790600101613097565b5091989097509095509350505050565b5f5f80516020615dbd8339815191528161311e61028f85613de7565b90505f61312a876117ba565b90506131358761221d565b613155576040516330efa98b60e01b8152600481018890526024016104da565b60028151600581111561316a5761316a61522e565b1461318b57805160405163170cc93360e21b81526104da9190600401615418565b5f82826080015161319c91906158a2565b905083600201600a9054906101000a90046001600160401b031682604001516131c59190615a7d565b6001600160401b0316816001600160401b0316111561320257604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f8061320e8a846135b0565b915091505f8a8360405160200161323c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132cf576132cf61522e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461341057825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b600281101561345f576134278160016159bf565b6134329060086157f2565b61ffff16858281518110613448576134486154af565b016020015160f81c901b9190911790600101613413565b5061ffff8116156134895760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156134e4576134a08160036159bf565b6134ab9060086157f2565b63ffffffff16866134bd836002615784565b815181106134cd576134cd6154af565b016020015160f81c901b919091179060010161348c565b5063ffffffff811660021461350c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135615761352381601f6159bf565b61352e9060086157f2565b8761353a836006615784565b8151811061354a5761354a6154af565b016020015160f81c901b919091179060010161350f565b505f86602681518110613576576135766154af565b016020015191976001600160f81b03199092161515965090945050505050565b61359e614382565b6135a7826143cd565b6112db8161443b565b5f8281525f80516020615e1d833981519152602052604081206002015481905f80516020615ddd83398151915290600160801b90046001600160401b03166135f885826144a3565b5f6136028761467d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136528a858b611d51565b6040518263ffffffff1660e01b815260040161366e9190615426565b6020604051808303815f875af115801561368a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136ae9190615438565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615dbd83398151915290505f61372784604001516117ba565b90505f60038251600581111561373f5761373f61522e565b148061375d575060048251600581111561375b5761375b61522e565b145b1561376d575060c08101516137aa565b6002825160058111156137825761378261522e565b0361378e5750426137aa565b815160405163170cc93360e21b81526104da9190600401615418565b84608001516001600160401b0316816001600160401b0316116137d157505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137f690610fe4565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613886573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138aa9190615438565b95945050505050565b5f808251602e146138e957825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613938576139008160016159bf565b61390b9060086157f2565b61ffff16858281518110613921576139216154af565b016020015160f81c901b91909117906001016138ec565b5061ffff8116156139625760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156139bd576139798160036159bf565b6139849060086157f2565b63ffffffff1686613996836002615784565b815181106139a6576139a66154af565b016020015160f81c901b9190911790600101613965565b5063ffffffff8116156139e357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a38576139fa81601f6159bf565b613a059060086157f2565b87613a11836006615784565b81518110613a2157613a216154af565b016020015160f81c901b91909117906001016139e6565b505f805b6008811015613a9757613a508160076159bf565b613a5b9060086157f2565b6001600160401b031688613a70836026615784565b81518110613a8057613a806154af565b016020015160f81c901b9190911790600101613a3c565b5090969095509350505050565b613aac614fed565b5f8281525f80516020615e1d8339815191526020526040808220815160e0810190925280545f80516020615ddd83398151915293929190829060ff166005811115613af957613af961522e565b6005811115613b0a57613b0a61522e565b8152602001600182018054613b1e906153e0565b80601f0160208091040260200160405190810160405280929190818152602001828054613b4a906153e0565b8015613b955780601f10613b6c57610100808354040283529160200191613b95565b820191905f5260205f20905b815481529060010190602001808311613b7857829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c0357613c0361522e565b14613c36575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615418565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c7a57613c7a61522e565b021790555060208201516001820190613c9390826156b5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d3185826135b0565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146f2565b5f610c71825f80516020615d9d833981519152546001600160a01b031690614753565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e4e57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ddd83398151915242613e6d60608601604087016151f5565b6001600160401b0316111580613ea75750613e8b6202a30042615784565b613e9b60608601604087016151f5565b6001600160401b031610155b15613ee157613ebc60608501604086016151f5565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613ef6613ef16060860186615aa8565b6148ac565b613f06613ef16080860186615aa8565b6030613f1560208601866159d2565b905014613f4757613f2960208501856159d2565b6040516326475b2f60e11b81526104da925060040190815260200190565b613f5184806159d2565b90505f03613f7e57613f6384806159d2565b604051633e08a12560e11b81526004016104da929190615abc565b5f60088201613f8d86806159d2565b604051613f9b929190615893565b90815260200160405180910390205414613fd457613fb984806159d2565b60405163a41f772f60e01b81526004016104da929190615abc565b613fde835f6144a3565b6040805160e08101909152815481525f9081906140ea906020810161400389806159d2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061404b908a018a6159d2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161409460608a0160408b016151f5565b6001600160401b031681526020016140af60608a018a615aa8565b6140b890615aea565b81526020016140ca60808a018a615aa8565b6140d390615aea565b8152602001876001600160401b0316815250614a15565b5f8281526006860160205260409020919350915061410882826156b5565b50816008840161411888806159d2565b604051614126929190615893565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614162908590600401615426565b6020604051808303815f875af115801561417e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141a29190615438565b6040805160e0810190915290915080600181526020016141c289806159d2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156142515761425161522e565b02179055506020820151600182019061426a90826156b5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061430888806159d2565b604051614316929190615893565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061435491906151f5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143cb57604051631afcd79f60e31b815260040160405180910390fd5b565b6143d5614382565b6143de81614c02565b6143e6614c1b565b610d416060820135608083013561440360c0850160a086016151f5565b61441360e0860160c08701615bb1565b614424610100870160e08801615bca565b6144366101208801610100890161544f565b614c2b565b614443614382565b5f80516020615d9d8339815191526001600160a01b03821661448357604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615ddd8339815191525f6001600160401b0380841690851611156144d7576144d083856158c2565b90506144e4565b6144e184846158c2565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614546575060018401548151614542916001600160401b031690615784565b8210155b1561456c576001600160401b03831660608201528181526040810151602082015261458b565b828160600181815161457e91906158a2565b6001600160401b03169052505b606081015161459b906064615a7d565b602082015160018601546001600160401b0392909216916145c69190600160401b900460ff166157f2565b10156145f657606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146119190615784565b9052506040810180516001600160401b03871691906146319083906159bf565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615e1d8339815191526020526040812060020180545f80516020615ddd83398151915291906008906146c790600160401b90046001600160401b0316615bea565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147066001600160a01b03841683614d5a565b905080515f1415801561472a5750808060200190518101906147289190615c05565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614799573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147bd9190615438565b90506147d46001600160a01b038516333086614d67565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614818573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061483c9190615438565b90508181116148a25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6138aa82826159bf565b6148b96020820182615128565b63ffffffff161580156148d957506148d4602082018261546a565b151590505b15614920576148eb6020820182615128565b6148f8602083018361546a565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b61492d602082018261546a565b905061493c6020830183615128565b63ffffffff161115614955576148eb6020820182615128565b60015b614965602083018361546a565b90508110156112db5761497b602083018361546a565b6149866001846159bf565b818110614995576149956154af565b90506020020160208101906149aa919061544f565b6001600160a01b03166149c0602084018461546a565b838181106149d0576149d06154af565b90506020020160208101906149e5919061544f565b6001600160a01b03161015614a0d57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614958565b5f6060826040015151603014614a3e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a7f988a986001989297929690959094909390929101615c20565b60405160208183030381529060405290505f5b84608001516020015151811015614af157818560800151602001518281518110614abe57614abe6154af565b6020026020010151604051602001614ad7929190615cda565b60408051601f198184030181529190529150600101614a92565b5060a0840151805160209182015151604051614b11938593929101615d10565b60405160208183030381529060405290505f5b8460a001516020015151811015614b8357818560a00151602001518281518110614b5057614b506154af565b6020026020010151604051602001614b69929190615cda565b60408051601f198184030181529190529150600101614b24565b5060c0840151604051614b9a918391602001615d4b565b6040516020818303038152906040529050600281604051614bbb9190615660565b602060405180830381855afa158015614bd6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bf99190615438565b94909350915050565b614c0a614382565b614c12614da0565b610d4181614da8565b614c23614382565b6143cb614e90565b614c33614382565b5f80516020615dbd83398151915261ffff84161580614c57575061271061ffff8516115b15614c7b57604051635f12e6c360e11b815261ffff851660048201526024016104da565b85871115614c9f5760405163222d164360e21b8152600481018890526024016104da565b60ff83161580614cb25750600a60ff8416115b15614cd55760405163170db35960e31b815260ff841660048201526024016104da565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d4a83835f614e98565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613db5565b6143cb614382565b614db0614382565b80355f80516020615ddd8339815191529081556014614dd56060840160408501615bca565b60ff161180614df45750614def6060830160408401615bca565b60ff16155b15614e2857614e096060830160408401615bca565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614e386060830160408401615bca565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e6960408301602084016151f5565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ad9614382565b606081471015614ebd5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614ed89190615660565b5f6040518083038185875af1925050503d805f8114614f12576040519150601f19603f3d011682016040523d82523d5f602084013e614f17565b606091505b5091509150614f27868383614f31565b9695505050505050565b606082614f4657614f4182614f8d565b611d4a565b8151158015614f5d57506001600160a01b0384163b155b15614f8657604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611d4a565b805115614f9d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614fc2906153e0565b5f825580601f10614fd1575050565b601f0160209004905f5260205f2090810190610d41919061502a565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b8082111561503e575f815560010161502b565b5090565b8015158114610d41575f80fd5b803563ffffffff81168114615062575f80fd5b919050565b5f805f60608486031215615079575f80fd5b83359250602084013561508b81615042565b91506150996040850161504f565b90509250925092565b5f602082840312156150b2575f80fd5b5035919050565b5f80604083850312156150ca575f80fd5b82356001600160401b038111156150df575f80fd5b8301608081860312156150f0575f80fd5b91506150fe6020840161504f565b90509250929050565b5f8060408385031215615118575f80fd5b823591506150fe6020840161504f565b5f60208284031215615138575f80fd5b611d4a8261504f565b803561ffff81168114615062575f80fd5b80356001600160401b0381168114615062575f80fd5b5f805f806080858703121561517b575f80fd5b84356001600160401b03811115615190575f80fd5b850160a081880312156151a1575f80fd5b93506151af60208601615141565b92506151bd60408601615152565b9396929550929360600135925050565b5f80604083850312156151de575f80fd5b6151e78361504f565b946020939093013593505050565b5f60208284031215615205575f80fd5b611d4a82615152565b5f806040838503121561521f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106152525761525261522e565b9052565b5f5b83811015615270578181015183820152602001615258565b50505f910152565b5f815180845261528f816020860160208601615256565b601f01601f19169290920160200192915050565b602081526152b5602082018351615242565b5f602083015160e060408401526152d0610100840182615278565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d41575f80fd5b5f8082840361014081121561534a575f80fd5b61012080821215615359575f80fd5b849350830135905061536a81615323565b809150509250929050565b5f8060208385031215615386575f80fd5b82356001600160401b038082111561539c575f80fd5b818501915085601f8301126153af575f80fd5b8135818111156153bd575f80fd5b8660208285010111156153ce575f80fd5b60209290920196919550909350505050565b600181811c908216806153f457607f821691505b60208210810361541257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c718284615242565b602081525f611d4a6020830184615278565b5f60208284031215615448575f80fd5b5051919050565b5f6020828403121561545f575f80fd5b8135611d4a81615323565b5f808335601e1984360301811261547f575f80fd5b8301803591506001600160401b03821115615498575f80fd5b6020019150600581901b3603821315613700575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154d7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615517576155176154e1565b60405290565b604080519081016001600160401b0381118282101715615517576155176154e1565b604051601f8201601f191681016001600160401b0381118282101715615567576155676154e1565b604052919050565b5f6001600160401b03821115615587576155876154e1565b50601f01601f191660200190565b5f82601f8301126155a4575f80fd5b81356155b76155b28261556f565b61553f565b8181528460208386010111156155cb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155f7575f80fd5b6155ff6154f5565b82356001600160401b0380821115615615575f80fd5b61562136838701615595565b83526020850135915080821115615636575f80fd5b5061564336828601615595565b60208301525061565560408401615152565b604082015292915050565b5f82516154d7818460208701615256565b601f8211156104e357805f5260205f20601f840160051c810160208510156156965750805b601f840160051c820191505b81811015611676575f81556001016156a2565b81516001600160401b038111156156ce576156ce6154e1565b6156e2816156dc84546153e0565b84615671565b602080601f831160018114615715575f84156156fe5750858301515b5f19600386901b1c1916600185901b178555610ea8565b5f85815260208120601f198616915b8281101561574357888601518255948401946001909101908401615724565b508582101561576057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c7157610c71615770565b5f63ffffffff8083168181036157af576157af615770565b6001019392505050565b5f826157d357634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157ec576157ec61522e565b91905290565b8082028115828204841417610c7157610c71615770565b5f60208083525f845461581b816153e0565b806020870152604060018084165f811461583c576001811461585857615885565b60ff19851660408a0152604084151560051b8a01019550615885565b895f5260205f205f5b8581101561587c5781548b8201860152908301908801615861565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611eaf57611eaf615770565b6001600160401b03828116828216039080821115611eaf57611eaf615770565b805161506281615042565b5f80604083850312156158fe575f80fd5b82516001600160401b0380821115615914575f80fd5b9084019060608287031215615927575f80fd5b61592f6154f5565b8251815260208084015161594281615323565b82820152604084015183811115615957575f80fd5b80850194505087601f85011261596b575f80fd5b8351925061597b6155b28461556f565b838152888285870101111561598e575f80fd5b61599d84838301848801615256565b806040840152508195506159b28188016158e2565b9450505050509250929050565b81810381811115610c7157610c71615770565b5f808335601e198436030181126159e7575f80fd5b8301803591506001600160401b03821115615a00575f80fd5b602001915036819003821315613700575f80fd5b5f8851615a25818460208d01615256565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615aa057615aa0615770565b505092915050565b5f8235603e198336030181126154d7575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615afa575f80fd5b615b0261551d565b615b0b8361504f565b81526020808401356001600160401b0380821115615b27575f80fd5b9085019036601f830112615b39575f80fd5b813581811115615b4b57615b4b6154e1565b8060051b9150615b5c84830161553f565b8181529183018401918481019036841115615b75575f80fd5b938501935b83851015615b9f5784359250615b8f83615323565b8282529385019390850190615b7a565b94860194909452509295945050505050565b5f60208284031215615bc1575f80fd5b611d4a82615141565b5f60208284031215615bda575f80fd5b813560ff81168114611d4a575f80fd5b5f6001600160401b038083168181036157af576157af615770565b5f60208284031215615c15575f80fd5b8151611d4a81615042565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615c6681602a850160208b01615256565b865190830190615c7d81602a840160208b01615256565b60c087901b6001600160c01b031916602a9290910191820152615caf603282018660e01b6001600160e01b0319169052565b615cc8603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ceb818460208801615256565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615d21818460208901615256565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615d5c818460208801615256565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -292,6 +292,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ADDRESSL return _ERC20TokenStakingManager.Contract.ADDRESSLENGTH(&_ERC20TokenStakingManager.CallOpts) } +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) BIPSCONVERSIONFACTOR(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "BIPS_CONVERSION_FACTOR") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) BIPSCONVERSIONFACTOR() (uint16, error) { + return _ERC20TokenStakingManager.Contract.BIPSCONVERSIONFACTOR(&_ERC20TokenStakingManager.CallOpts) +} + +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) BIPSCONVERSIONFACTOR() (uint16, error) { + return _ERC20TokenStakingManager.Contract.BIPSCONVERSIONFACTOR(&_ERC20TokenStakingManager.CallOpts) +} + // BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. // // Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) diff --git a/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go index d343cda87..0aac32cc2 100644 --- a/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -31,8 +31,8 @@ var ( // ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. var ExampleRewardCalculatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"uptimeSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", - Bin: "0x60a0604052348015600e575f80fd5b50604051610357380380610357833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102d36100845f395f8181609e015261013a01526102d35ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80635dcc93911461004e578063778c06b51461006c578063afba878a1461007f578063bb65b24214610099575b5f80fd5b6100596301e1338081565b6040519081526020015b60405180910390f35b61005961007a3660046101b6565b6100d9565b610087605081565b60405160ff9091168152602001610063565b6100c07f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610063565b5f60506100e68887610236565b6100f0919061025e565b67ffffffffffffffff1661010585606461025e565b67ffffffffffffffff16101561011c57505f61018f565b6127106301e1338061012e8888610236565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168b61016e919061028a565b610178919061028a565b61018291906102a7565b61018c91906102a7565b90505b979650505050505050565b803567ffffffffffffffff811681146101b1575f80fd5b919050565b5f805f805f805f60e0888a0312156101cc575f80fd5b873596506101dc6020890161019a565b95506101ea6040890161019a565b94506101f86060890161019a565b93506102066080890161019a565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561025757610257610222565b5092915050565b67ffffffffffffffff81811683821602808216919082811461028257610282610222565b505092915050565b80820281158282048414176102a1576102a1610222565b92915050565b5f826102c157634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"uptimeSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b5060405161037e38038061037e833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102fa6100845f395f818160c5015261016101526102fa5ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80635dcc939114610059578063778c06b514610077578063a9778a7a1461008a578063afba878a146100a6578063bb65b242146100c0575b5f80fd5b6100646301e1338081565b6040519081526020015b60405180910390f35b6100646100853660046101dd565b610100565b61009361271081565b60405161ffff909116815260200161006e565b6100ae605081565b60405160ff909116815260200161006e565b6100e77f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161006e565b5f605061010d888761025d565b6101179190610285565b67ffffffffffffffff1661012c856064610285565b67ffffffffffffffff16101561014357505f6101b6565b6127106301e13380610155888861025d565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168b61019591906102b1565b61019f91906102b1565b6101a991906102ce565b6101b391906102ce565b90505b979650505050505050565b803567ffffffffffffffff811681146101d8575f80fd5b919050565b5f805f805f805f60e0888a0312156101f3575f80fd5b87359650610203602089016101c1565b9550610211604089016101c1565b945061021f606089016101c1565b935061022d608089016101c1565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561027e5761027e610249565b5092915050565b67ffffffffffffffff8181168382160280821691908281146102a9576102a9610249565b505092915050565b80820281158282048414176102c8576102c8610249565b92915050565b5f826102e857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -202,6 +202,37 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transact(o return _ExampleRewardCalculator.Contract.contract.Transact(opts, method, params...) } +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) BIPSCONVERSIONFACTOR(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "BIPS_CONVERSION_FACTOR") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) BIPSCONVERSIONFACTOR() (uint16, error) { + return _ExampleRewardCalculator.Contract.BIPSCONVERSIONFACTOR(&_ExampleRewardCalculator.CallOpts) +} + +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) BIPSCONVERSIONFACTOR() (uint16, error) { + return _ExampleRewardCalculator.Contract.BIPSCONVERSIONFACTOR(&_ExampleRewardCalculator.CallOpts) +} + // SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. // // Solidity: function SECONDS_IN_YEAR() view returns(uint256) diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 9bff585a9..0ebb5d4c2 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -90,8 +90,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615c96380380615c9683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b498061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614e00565b61060a565b005b348015610216575f80fd5b50610209610225366004614e3b565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614e00565b61084d565b34801561027f575f80fd5b5061020961028e366004614e52565b610858565b34801561029e575f80fd5b506102096102ad366004614ea0565b610d44565b3480156102bd575f80fd5b506102096102cc366004614eb7565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614e3b565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614e00565b610eab565b34801561038c575f80fd5b5061020961039b366004614ed8565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614ef1565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614f2f565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614e3b565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614e00565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614e3b565b61123b565b3480156104a4575f80fd5b506102096104b3366004614ef1565b611306565b3480156104c3575f80fd5b506102096104d2366004614ed8565b6114de565b6104076104e5366004614f59565b611667565b3480156104f5575f80fd5b506104075f80516020615abd83398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614e3b565b61169b565b34801561054e575f80fd5b506104075f80516020615add83398151915281565b34801561056e575f80fd5b5061020961057d366004614e3b565b611884565b610407610590366004614e3b565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614e3b565b6119f2565b60405161024c9190615022565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b506104076106053660046150a2565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff16600581111561068c5761068c614fad565b600581111561069d5761069d614fad565b81526020016001820180546106b19061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061510d565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614fad565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611ea3565b6040518263ffffffff1660e01b8152600401610807919061514d565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610847919061515f565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615add8339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610911919061515f565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161518a565b6001600160a01b03161461098e57610969606084016040850161518a565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c60608501856151a5565b905090505f805b828163ffffffff161015610c84575f6109bf60608801886151a5565b8363ffffffff168181106109d5576109d56151ea565b90506020028101906109e791906151fe565b6109f090615322565b80516040519192505f916008880191610a089161539b565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b8152610631919060040161514d565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a819161539b565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf919061515f565b90508086600801835f0151604051610ad7919061539b565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614fad565b021790555060208201516001820190610b7290826153f0565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c179116856154bf565b8251604051919550610c289161539b565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d906154d2565b90506109a3565b50600483018190555f610ca2610c9986611ef2565b60400151612008565b90505f610cae87612195565b90505f600282604051610cc1919061539b565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff919061515f565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd58361236f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a82612380565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614fad565b14610e8b578060405163170cc93360e21b8152600401610631919061513f565b61084783836123bb565b5f610ea564e8d4a51000836154f4565b92915050565b610847838383612635565b610ebe61282e565b5f80516020615abd8339815191525f80610ed784612865565b91509150610ee482612380565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614fad565b03610f44575f83815260078501602052604081208054919055610f428282612ba3565b505b610f5a81610f5584604001516111e3565b612c01565b505050505b610f7560015f80516020615afd83398151915255565b50565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115610fc557610fc5614fad565b6003811115610fd657610fd6614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614fad565b14611084578251604051633b0d540d60e21b81526106319190600401615513565b60048151600581111561109957611099614fad565b036110af576110a785612c27565b505050505050565b5f806110c66110bd89611ef2565b60400151612e0e565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a5100061552d565b5f611206826119f2565b6080015192915050565b61121b838383612635565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615abd8339815191525f611253836119f2565b519050600481600581111561126a5761126a614fad565b1461128a578060405163170cc93360e21b8152600401610631919061513f565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612ba3565b61130e61282e565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff16600381111561135b5761135b614fad565b600381111561136c5761136c614fad565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614fad565b14611406578051604051633b0d540d60e21b81526106319190600401615513565b600461141582604001516119f2565b51600581111561142757611427614fad565b146114b9575f61143685611ef2565b90505f806114478360400151612e0e565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c27565b50506114da60015f80516020615afd83398151915255565b5050565b5f80516020615add8339815191525f806115036114fa85611ef2565b60400151613064565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f828152600684016020526040902080546115439061510d565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614fad565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068401602052604081206115d891614d54565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61167061282e565b61167c84848434613220565b905061169460015f80516020615afd83398151915255565b9392505050565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff1660038111156116e8576116e8614fad565b60038111156116f9576116f9614fad565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614fad565b14158015611793575060038151600381111561179057611790614fad565b14155b156117b4578051604051633b0d540d60e21b81526106319190600401615513565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611ea3565b6040518263ffffffff1660e01b815260040161183d919061514d565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d919061515f565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615add83398151915291906118cb9061510d565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614fad565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119819190600401615544565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a919061515f565b5f6119ca61282e565b6119d58233346133ee565b90506119ed60015f80516020615afd83398151915255565b919050565b6119fa614d8b565b5f8281525f80516020615b1d833981519152602052604090819020815160e0810190925280545f80516020615add833981519152929190829060ff166005811115611a4757611a47614fad565b6005811115611a5857611a58614fad565b8152602001600182018054611a6c9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a989061510d565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615add833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8490869086906155ce565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd8339815191529284929091829060ff166003811115611bea57611bea614fad565b6003811115611bfb57611bfb614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614fad565b14611ca9578251604051633b0d540d60e21b81526106319190600401615513565b60208301516001600160a01b03163314611d4c575f828152600485016020526040902054336001600160a01b0390911603611d46575f82815260048501602052604090205460a0820151611d0d91600160b01b90046001600160401b0316906155dd565b6001600160401b0316421015611d415760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b611d4c565b336112ab565b600281516005811115611d6157611d61614fad565b03611e3e578615611d7857611d7682876123bb565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611db1918491611dac91906155fd565b6136c3565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611df28461381a565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e5357611e53614fad565b03611e8757611e618361381a565b5f898152600686016020526040902055611e7a88612c27565b6001945050505050611694565b805160405163170cc93360e21b8152610631919060040161513f565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f56573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7d9190810190615628565b9150915080611f9f57604051636b2f19e960e01b815260040160405180910390fd5b815115611fc5578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612001576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461203d57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561208c576120548160016156fa565b61205f90600861552d565b61ffff16848281518110612075576120756151ea565b016020015160f81c901b9190911790600101612040565b5061ffff8116156120b65760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612111576120cd8160036156fa565b6120d890600861552d565b63ffffffff16856120ea8360026154bf565b815181106120fa576120fa6151ea565b016020015160f81c901b91909117906001016120b9565b5063ffffffff81161561213757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561218c5761214e81601f6156fa565b61215990600861552d565b866121658360066154bf565b81518110612175576121756151ea565b016020015160f81c901b919091179060010161213a565b50949350505050565b60605f808335602085013560146121b18787016040890161518a565b6121be60608901896151a5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61224460608501856151a5565b9050811015612001578161225b60608601866151a5565b8381811061226b5761226b6151ea565b905060200281019061227d91906151fe565b612287908061570d565b905061229660608701876151a5565b848181106122a6576122a66151ea565b90506020028101906122b891906151fe565b6122c2908061570d565b6122cf60608901896151a5565b868181106122df576122df6151ea565b90506020028101906122f191906151fe565b6122ff90602081019061570d565b61230c60608b018b6151a5565b8881811061231c5761231c6151ea565b905060200281019061232e91906151fe565b61233f906060810190604001614f2f565b604051602001612355979695949392919061574f565b60408051601f198184030181529190529150600101612237565b6123776139c6565b610f7581613a11565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612406573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261242d9190810190615628565b915091508061244f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b6919061515f565b8251146124dc578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612518576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125278460400151613a7f565b9150915081871461254e5760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615abd833981519152906001600160401b03908116908316111561260b575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261262a565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615abd8339815191528161264e86613c70565b905061265986612380565b61266857600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461268d57336112ab565b5f86815260048301602052604090205460a08201516126bc91600160b01b90046001600160401b0316906155dd565b6001600160401b03168160c001516001600160401b031610156127035760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f851561271b5761271487866123bb565b9050612739565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061275e906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156127d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f8919061515f565b905080846007015f8a81526020019081526020015f205f82825461281c91906154bf565b90915550501515979650505050505050565b5f80516020615afd83398151915280546001190161285f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61286e614d8b565b5f80516020615add8339815191525f8061288a6114fa87611ef2565b9150915080156128b157604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128e2576128e2614fad565b60058111156128f3576128f3614fad565b81526020016001820180546129079061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546129339061510d565b801561297e5780601f106129555761010080835404028352916020019161297e565b820191905f5260205f20905b81548152906001019060200180831161296157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129e9576129e9614fad565b14158015612a0a5750600181516005811115612a0757612a07614fad565b14155b15612a2b57805160405163170cc93360e21b8152610631919060040161513f565b600381516005811115612a4057612a40614fad565b03612a4e5760048152612a53565b600581525b836008018160200151604051612a69919061539b565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aad57612aad614fad565b021790555060208201516001820190612ac690826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b6c57612b6c614fad565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612bef575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f54565b60015f80516020615afd83398151915255565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115612c7457612c74614fad565b6003811115612c8557612c85614fad565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612db3575f84815260048701602052604090205461271090612d6590600160a01b900461ffff168561552d565b612d6f91906154f4565b915081866007015f8681526020019081526020015f205f828254612d9391906154bf565b90915550612da3905082846156fa565b9050612db3856020015182612ba3565b612dc88560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4557835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e9457612e5c8160016156fa565b612e6790600861552d565b61ffff16868281518110612e7d57612e7d6151ea565b016020015160f81c901b9190911790600101612e48565b5061ffff811615612ebe5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f1957612ed58160036156fa565b612ee090600861552d565b63ffffffff1687612ef28360026154bf565b81518110612f0257612f026151ea565b016020015160f81c901b9190911790600101612ec1565b5063ffffffff8116600314612f4157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f9657612f5881601f6156fa565b612f6390600861552d565b88612f6f8360066154bf565b81518110612f7f57612f7f6151ea565b016020015160f81c901b9190911790600101612f44565b505f805b6008811015612ff557612fae8160076156fa565b612fb990600861552d565b6001600160401b031689612fce8360266154bf565b81518110612fde57612fde6151ea565b016020015160f81c901b9190911790600101612f9a565b505f805b60088110156130545761300d8160076156fa565b61301890600861552d565b6001600160401b03168a61302d83602e6154bf565b8151811061303d5761303d6151ea565b016020015160f81c901b9190911790600101612ff9565b5091989097509095509350505050565b5f80825160271461309a57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b60028110156130e9576130b18160016156fa565b6130bc90600861552d565b61ffff168582815181106130d2576130d26151ea565b016020015160f81c901b919091179060010161309d565b5061ffff8116156131135760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561316e5761312a8160036156fa565b61313590600861552d565b63ffffffff16866131478360026154bf565b81518110613157576131576151ea565b016020015160f81c901b9190911790600101613116565b5063ffffffff811660021461319657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131eb576131ad81601f6156fa565b6131b890600861552d565b876131c48360066154bf565b815181106131d4576131d46151ea565b016020015160f81c901b9190911790600101613199565b505f86602681518110613200576132006151ea565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615abd83398151915290600160401b900461ffff9081169086161080613274575061271061ffff8616115b1561329857604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b0390811690851610156132d4576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806132e65750806001015483115b156133075760405163222d164360e21b815260048101849052602401610631565b825f61331282610e95565b90505f61331f8983613fe7565b905060405180608001604052806133333390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615abd8339815191528161340784610e95565b90505f613413876119f2565b905061341e87612380565b61343e576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561345357613453614fad565b1461347457805160405163170cc93360e21b8152610631919060040161513f565b5f82826080015161348591906155dd565b905083600201600a9054906101000a90046001600160401b031682604001516134ae91906157b8565b6001600160401b0316816001600160401b031611156134eb57604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806134f78a846136c3565b915091505f8a8360405160200161352592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135b8576135b8614fad565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615b1d833981519152602052604081206002015481905f80516020615add83398151915290600160801b90046001600160401b031661370b858261455f565b5f61371587614739565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137658a858b611ea3565b6040518263ffffffff1660e01b8152600401613781919061514d565b6020604051808303815f875af115801561379d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c1919061515f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615abd83398151915290505f61383a84604001516119f2565b90505f60038251600581111561385257613852614fad565b1480613870575060048251600581111561386e5761386e614fad565b145b15613880575060c08101516138bd565b60028251600581111561389557613895614fad565b036138a15750426138bd565b815160405163170cc93360e21b8152610631919060040161513f565b84608001516001600160401b0316816001600160401b0316116138e457505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613909906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139bd919061515f565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a0f57604051631afcd79f60e31b815260040160405180910390fd5b565b613a196139c6565b613a22816147ae565b613a2a6147c7565b610f7560608201356080830135613a4760c0850160a08601614f2f565b613a5760e0860160c087016157e3565b613a68610100870160e088016157fc565b613a7a6101208801610100890161518a565b6147d7565b5f808251602e14613ab557825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b0457613acc8160016156fa565b613ad790600861552d565b61ffff16858281518110613aed57613aed6151ea565b016020015160f81c901b9190911790600101613ab8565b5061ffff811615613b2e5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b8957613b458160036156fa565b613b5090600861552d565b63ffffffff1686613b628360026154bf565b81518110613b7257613b726151ea565b016020015160f81c901b9190911790600101613b31565b5063ffffffff811615613baf57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c0457613bc681601f6156fa565b613bd190600861552d565b87613bdd8360066154bf565b81518110613bed57613bed6151ea565b016020015160f81c901b9190911790600101613bb2565b505f805b6008811015613c6357613c1c8160076156fa565b613c2790600861552d565b6001600160401b031688613c3c8360266154bf565b81518110613c4c57613c4c6151ea565b016020015160f81c901b9190911790600101613c08565b5090969095509350505050565b613c78614d8b565b5f8281525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff166005811115613cc557613cc5614fad565b6005811115613cd657613cd6614fad565b8152602001600182018054613cea9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054613d169061510d565b8015613d615780601f10613d3857610100808354040283529160200191613d61565b820191905f5260205f20905b815481529060010190602001808311613d4457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dcf57613dcf614fad565b14613e02575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e4657613e46614fad565b021790555060208201516001820190613e5f90826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613efd85826136c3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f775760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fc0576040519150601f19603f3d011682016040523d82523d5f602084013e613fc5565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661402b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615add8339815191524261404a6060860160408701614f2f565b6001600160401b031611158061408457506140686202a300426154bf565b6140786060860160408701614f2f565b6001600160401b031610155b156140be576140996060850160408601614f2f565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b6140d36140ce606086018661581c565b614906565b6140e36140ce608086018661581c565b60306140f2602086018661570d565b90501461412457614106602085018561570d565b6040516326475b2f60e11b8152610631925060040190815260200190565b61412e848061570d565b90505f0361415b57614140848061570d565b604051633e08a12560e11b8152600401610631929190615830565b5f6008820161416a868061570d565b6040516141789291906155ce565b908152602001604051809103902054146141b157614196848061570d565b60405163a41f772f60e01b8152600401610631929190615830565b6141bb835f61455f565b6040805160e08101909152815481525f9081906142c790602081016141e0898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614228908a018a61570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161427160608a0160408b01614f2f565b6001600160401b0316815260200161428c60608a018a61581c565b6142959061585e565b81526020016142a760808a018a61581c565b6142b09061585e565b8152602001876001600160401b0316815250614a6f565b5f828152600686016020526040902091935091506142e582826153f0565b5081600884016142f5888061570d565b6040516143039291906155ce565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061433f90859060040161514d565b6020604051808303815f875af115801561435b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437f919061515f565b6040805160e08101909152909150806001815260200161439f898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561442e5761442e614fad565b02179055506020820151600182019061444790826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144e5888061570d565b6040516144f39291906155ce565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145319190614f2f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615add8339815191525f6001600160401b0380841690851611156145935761458c83856155fd565b90506145a0565b61459d84846155fd565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146025750600184015481516145fe916001600160401b0316906154bf565b8210155b15614628576001600160401b038316606082015281815260408101516020820152614647565b828160600181815161463a91906155dd565b6001600160401b03169052505b60608101516146579060646157b8565b602082015160018601546001600160401b0392909216916146829190600160401b900460ff1661552d565b10156146b257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146cd91906154bf565b9052506040810180516001600160401b03871691906146ed9083906156fa565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615b1d8339815191526020526040812060020180545f80516020615add833981519152919060089061478390600160401b90046001600160401b0316615925565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147b66139c6565b6147be614c5c565b610f7581614c64565b6147cf6139c6565b613a0f614d4c565b6147df6139c6565b5f80516020615abd83398151915261ffff84161580614803575061271061ffff8516115b1561482757604051635f12e6c360e11b815261ffff85166004820152602401610631565b8587111561484b5760405163222d164360e21b815260048101889052602401610631565b60ff8316158061485e5750600a60ff8416115b156148815760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6149136020820182614ed8565b63ffffffff16158015614933575061492e60208201826151a5565b151590505b1561497a576149456020820182614ed8565b61495260208301836151a5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b61498760208201826151a5565b90506149966020830183614ed8565b63ffffffff1611156149af576149456020820182614ed8565b60015b6149bf60208301836151a5565b90508110156114da576149d560208301836151a5565b6149e06001846156fa565b8181106149ef576149ef6151ea565b9050602002016020810190614a04919061518a565b6001600160a01b0316614a1a60208401846151a5565b83818110614a2a57614a2a6151ea565b9050602002016020810190614a3f919061518a565b6001600160a01b03161015614a6757604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149b2565b5f6060826040015151603014614a985760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614ad9988a986001989297929690959094909390929101615940565b60405160208183030381529060405290505f5b84608001516020015151811015614b4b57818560800151602001518281518110614b1857614b186151ea565b6020026020010151604051602001614b319291906159fa565b60408051601f198184030181529190529150600101614aec565b5060a0840151805160209182015151604051614b6b938593929101615a30565b60405160208183030381529060405290505f5b8460a001516020015151811015614bdd57818560a00151602001518281518110614baa57614baa6151ea565b6020026020010151604051602001614bc39291906159fa565b60408051601f198184030181529190529150600101614b7e565b5060c0840151604051614bf4918391602001615a6b565b6040516020818303038152906040529050600281604051614c15919061539b565b602060405180830381855afa158015614c30573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c53919061515f565b94909350915050565b613a0f6139c6565b614c6c6139c6565b80355f80516020615add8339815191529081556014614c9160608401604085016157fc565b60ff161180614cb05750614cab60608301604084016157fc565b60ff16155b15614ce457614cc560608301604084016157fc565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614cf460608301604084016157fc565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d256040830160208401614f2f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c146139c6565b508054614d609061510d565b5f825580601f10614d6f575050565b601f0160209004905f5260205f2090810190610f759190614dc8565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ddc575f8155600101614dc9565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614e12575f80fd5b833592506020840135614e2481614de0565b9150614e3260408501614ded565b90509250925092565b5f60208284031215614e4b575f80fd5b5035919050565b5f8060408385031215614e63575f80fd5b82356001600160401b03811115614e78575f80fd5b830160808186031215614e89575f80fd5b9150614e9760208401614ded565b90509250929050565b5f6101208284031215614eb1575f80fd5b50919050565b5f8060408385031215614ec8575f80fd5b82359150614e9760208401614ded565b5f60208284031215614ee8575f80fd5b61169482614ded565b5f8060408385031215614f02575f80fd5b614f0b83614ded565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614f3f575f80fd5b61169482614f19565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614f6b575f80fd5b83356001600160401b03811115614f80575f80fd5b840160a08187031215614f91575f80fd5b9250614f9f60208501614f48565b9150614e3260408501614f19565b634e487b7160e01b5f52602160045260245ffd5b60068110614fd157614fd1614fad565b9052565b5f5b83811015614fef578181015183820152602001614fd7565b50505f910152565b5f815180845261500e816020860160208601614fd5565b601f01601f19169290920160200192915050565b60208152615034602082018351614fc1565b5f602083015160e0604084015261504f610100840182614ff7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150b3575f80fd5b82356001600160401b03808211156150c9575f80fd5b818501915085601f8301126150dc575f80fd5b8135818111156150ea575f80fd5b8660208285010111156150fb575f80fd5b60209290920196919550909350505050565b600181811c9082168061512157607f821691505b602082108103614eb157634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614fc1565b602081525f6116946020830184614ff7565b5f6020828403121561516f575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561519a575f80fd5b813561169481615176565b5f808335601e198436030181126151ba575f80fd5b8301803591506001600160401b038211156151d3575f80fd5b6020019150600581901b3603821315613813575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615212575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152525761525261521c565b60405290565b604080519081016001600160401b03811182821017156152525761525261521c565b604051601f8201601f191681016001600160401b03811182821017156152a2576152a261521c565b604052919050565b5f6001600160401b038211156152c2576152c261521c565b50601f01601f191660200190565b5f82601f8301126152df575f80fd5b81356152f26152ed826152aa565b61527a565b818152846020838601011115615306575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615332575f80fd5b61533a615230565b82356001600160401b0380821115615350575f80fd5b61535c368387016152d0565b83526020850135915080821115615371575f80fd5b5061537e368286016152d0565b60208301525061539060408401614f19565b604082015292915050565b5f8251615212818460208701614fd5565b601f82111561063a57805f5260205f20601f840160051c810160208510156153d15750805b601f840160051c820191505b8181101561187d575f81556001016153dd565b81516001600160401b038111156154095761540961521c565b61541d81615417845461510d565b846153ac565b602080601f831160018114615450575f84156154395750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561547e5788860151825594840194600190910190840161545f565b508582101561549b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea56154ab565b5f63ffffffff8083168181036154ea576154ea6154ab565b6001019392505050565b5f8261550e57634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061552757615527614fad565b91905290565b8082028115828204841417610ea557610ea56154ab565b5f60208083525f84546155568161510d565b806020870152604060018084165f81146155775760018114615593576155c0565b60ff19851660408a0152604084151560051b8a010195506155c0565b895f5260205f205f5b858110156155b75781548b820186015290830190880161559c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115612001576120016154ab565b6001600160401b03828116828216039080821115612001576120016154ab565b80516119ed81614de0565b5f8060408385031215615639575f80fd5b82516001600160401b038082111561564f575f80fd5b9084019060608287031215615662575f80fd5b61566a615230565b8251815260208084015161567d81615176565b82820152604084015183811115615692575f80fd5b80850194505087601f8501126156a6575f80fd5b835192506156b66152ed846152aa565b83815288828587010111156156c9575f80fd5b6156d884838301848801614fd5565b806040840152508195506156ed81880161561d565b9450505050509250929050565b81810381811115610ea557610ea56154ab565b5f808335601e19843603018112615722575f80fd5b8301803591506001600160401b0382111561573b575f80fd5b602001915036819003821315613813575f80fd5b5f8851615760818460208d01614fd5565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146157db576157db6154ab565b505092915050565b5f602082840312156157f3575f80fd5b61169482614f48565b5f6020828403121561580c575f80fd5b813560ff81168114611694575f80fd5b5f8235603e19833603018112615212575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6040823603121561586e575f80fd5b615876615258565b61587f83614ded565b81526020808401356001600160401b038082111561589b575f80fd5b9085019036601f8301126158ad575f80fd5b8135818111156158bf576158bf61521c565b8060051b91506158d084830161527a565b81815291830184019184810190368411156158e9575f80fd5b938501935b83851015615913578435925061590383615176565b82825293850193908501906158ee565b94860194909452509295945050505050565b5f6001600160401b038083168181036154ea576154ea6154ab565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161598681602a850160208b01614fd5565b86519083019061599d81602a840160208b01614fd5565b60c087901b6001600160c01b031916602a92909101918201526159cf603282018660e01b6001600160e01b0319169052565b6159e8603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a0b818460208801614fd5565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615a41818460208901614fd5565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615a7c818460208801614fd5565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615ca1380380615ca183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b548061014d5f395ff3fe6080604052600436106101f1575f3560e01c806376f7862111610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063b771b3bc14610515578063ba3a4b971461052f578063bc5fbfec1461054e578063bee0a03f1461056e575f80fd5b8063a3a65e48116100d8578063a3a65e48146104c3578063a9778a7a14610345578063af2f5feb146104e2578063afb98096146104f5575f80fd5b806376f78621146104525780638280a25a1461047157806393e245981461048557806398f3e2b4146104a4575f80fd5b8063329c3e12116101895780635297fae6116101595780635297fae6146103ab57806360305d62146103ca57806362065856146103f357806366435abf14610420578063732214f81461043f575f80fd5b8063329c3e121461031357806335455ded146103455780633a1cfff61461036d578063467ef06f1461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806320e555651461029e57806325e1c776146102bd5780632e2194d8146102dc575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614e0b565b610615565b005b348015610221575f80fd5b50610214610230366004614e46565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614e0b565b610858565b34801561028a575f80fd5b50610214610299366004614e5d565b610863565b3480156102a9575f80fd5b506102146102b8366004614eab565b610d4f565b3480156102c8575f80fd5b506102146102d7366004614ec2565b610e2c565b3480156102e7575f80fd5b506102fb6102f6366004614e46565b610ea0565b6040516001600160401b039091168152602001610257565b34801561031e575f80fd5b5061032d6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610350575f80fd5b5061035a61271081565b60405161ffff9091168152602001610257565b348015610378575f80fd5b50610214610387366004614e0b565b610eb6565b348015610397575f80fd5b506102146103a6366004614ee3565b610ec1565b3480156103b6575f80fd5b506102146103c5366004614efc565b610f83565b3480156103d5575f80fd5b506103de601481565b60405163ffffffff9091168152602001610257565b3480156103fe575f80fd5b5061041261040d366004614f3a565b6111ee565b604051908152602001610257565b34801561042b575f80fd5b506102fb61043a366004614e46565b611207565b34801561044a575f80fd5b506104125f81565b34801561045d575f80fd5b5061021461046c366004614e0b565b61121b565b34801561047c575f80fd5b50610249603081565b348015610490575f80fd5b5061021461049f366004614e46565b611246565b3480156104af575f80fd5b506102146104be366004614efc565b611311565b3480156104ce575f80fd5b506102146104dd366004614ee3565b6114e9565b6104126104f0366004614f64565b611672565b348015610500575f80fd5b506104125f80516020615ac883398151915281565b348015610520575f80fd5b5061032d6005600160991b0181565b34801561053a575f80fd5b50610214610549366004614e46565b6116a6565b348015610559575f80fd5b506104125f80516020615ae883398151915281565b348015610579575f80fd5b50610214610588366004614e46565b61188f565b61041261059b366004614e46565b6119cc565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614e46565b6119fd565b604051610257919061502d565b3480156105eb575f80fd5b506102fb6202a30081565b348015610601575f80fd5b506104126106103660046150ad565b611b4c565b610620838383611ba7565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615b288339815191526020526040808220815160e0810190925280545f80516020615ae883398151915293929190829060ff16600581111561069757610697614fb8565b60058111156106a8576106a8614fb8565b81526020016001820180546106bc90615118565b80601f01602080910402602001604051908101604052809291908181526020018280546106e890615118565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e614fb8565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161514a565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611eae565b6040518263ffffffff1660e01b81526004016108129190615158565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061516a565b50505050565b610852838383611ba7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615ae88339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c919061516a565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b306109566060850160408601615195565b6001600160a01b031614610999576109746060840160408501615195565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856151b0565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886151b0565b8363ffffffff168181106109e0576109e06151f5565b90506020028101906109f29190615209565b6109fb9061532d565b80516040519192505f916008880191610a13916153a6565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c9190600401615158565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c916153a6565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca919061516a565b90508086600801835f0151604051610ae291906153a6565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b64614fb8565b021790555060208201516001820190610b7d90826153fb565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c229116856154ca565b8251604051919550610c33916153a6565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c88906154dd565b90506109ae565b50600483018190555f610cad610ca486611efd565b60400151612013565b90505f610cb9876121a0565b90505f600282604051610ccc91906153a6565b602060405180830381855afa158015610ce7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d0a919061516a565b9050828114610d3657604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d98575080546001600160401b03808416911610155b15610db65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610de08361237a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e358261238b565b610e55576040516330efa98b60e01b81526004810183905260240161063c565b5f610e5f836119fd565b5190506002816005811115610e7657610e76614fb8565b14610e96578060405163170cc93360e21b815260040161063c919061514a565b61085283836123c6565b5f610eb064e8d4a51000836154ff565b92915050565b610852838383612640565b610ec9612839565b5f80516020615ac88339815191525f80610ee284612870565b91509150610eef8261238b565b610efb57505050610f6a565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f2a57610f2a614fb8565b03610f4f575f83815260078501602052604081208054919055610f4d8282612bae565b505b610f6581610f6084604001516111ee565b612c0c565b505050505b610f8060015f80516020615b0883398151915255565b50565b5f8181525f80516020615aa88339815191526020526040808220815160e0810190925280545f80516020615ac883398151915293929190829060ff166003811115610fd057610fd0614fb8565b6003811115610fe157610fe1614fb8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611057826119fd565b905060018351600381111561106e5761106e614fb8565b1461108f578251604051633b0d540d60e21b815261063c919060040161551e565b6004815160058111156110a4576110a4614fb8565b036110ba576110b285612c32565b505050505050565b5f806110d16110c889611efd565b60400151612e19565b50915091508184146110fe57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806111375750806001600160401b03168560a001516001600160401b0316115b1561116057604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610eb06001600160401b03831664e8d4a51000615538565b5f611211826119fd565b6080015192915050565b611226838383612640565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615ac88339815191525f61125e836119fd565b519050600481600581111561127557611275614fb8565b14611295578060405163170cc93360e21b815260040161063c919061514a565b5f8381526004830160205260409020546001600160a01b031633146112db57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260078301602090815260408083208054908490556004860190925290912054610852906001600160a01b031682612bae565b611319612839565b5f8181525f80516020615aa88339815191526020526040808220815160e0810190925280545f80516020615ac883398151915293929190829060ff16600381111561136657611366614fb8565b600381111561137757611377614fb8565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113f0576113f0614fb8565b14611411578051604051633b0d540d60e21b815261063c919060040161551e565b600461142082604001516119fd565b51600581111561143257611432614fb8565b146114c4575f61144185611efd565b90505f806114528360400151612e19565b50915091508184604001511461147e5760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b031611156114c057604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b6114cd83612c32565b50506114e560015f80516020615b0883398151915255565b5050565b5f80516020615ae88339815191525f8061150e61150585611efd565b6040015161306f565b915091508061153457604051632d07135360e01b8152811515600482015260240161063c565b5f8281526006840160205260409020805461154e90615118565b90505f036115725760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561159857611598614fb8565b146115cb575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff169060040161514a565b5f82815260068401602052604081206115e391614d5f565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61167b612839565b6116878484843461322b565b905061169f60015f80516020615b0883398151915255565b9392505050565b5f8181525f80516020615aa88339815191526020526040808220815160e0810190925280545f80516020615ac883398151915293929190829060ff1660038111156116f3576116f3614fb8565b600381111561170457611704614fb8565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177d5761177d614fb8565b1415801561179e575060038151600381111561179b5761179b614fb8565b14155b156117bf578051604051633b0d540d60e21b815261063c919060040161551e565b5f6117cd82604001516119fd565b905080606001516001600160401b03165f036117ff576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb61182c846040015184606001518560800151611eae565b6040518263ffffffff1660e01b81526004016118489190615158565b6020604051808303815f875af1158015611864573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611888919061516a565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615ae883398151915291906118d690615118565b90505f036118fa5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff16600581111561192057611920614fb8565b14611953575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff169060040161514a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161198c919060040161554f565b6020604051808303815f875af11580156119a8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610645919061516a565b5f6119d5612839565b6119e08233346133f9565b90506119f860015f80516020615b0883398151915255565b919050565b611a05614d96565b5f8281525f80516020615b28833981519152602052604090819020815160e0810190925280545f80516020615ae8833981519152929190829060ff166005811115611a5257611a52614fb8565b6005811115611a6357611a63614fb8565b8152602001600182018054611a7790615118565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa390615118565b8015611aee5780601f10611ac557610100808354040283529160200191611aee565b820191905f5260205f20905b815481529060010190602001808311611ad157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615ae8833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8f90869086906155d9565b90815260200160405180910390205491505092915050565b5f8381525f80516020615aa88339815191526020526040808220815160e0810190925280545f80516020615ac88339815191529284929091829060ff166003811115611bf557611bf5614fb8565b6003811115611c0657611c06614fb8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c7c826119fd565b9050600283516003811115611c9357611c93614fb8565b14611cb4578251604051633b0d540d60e21b815261063c919060040161551e565b60208301516001600160a01b03163314611d57575f828152600485016020526040902054336001600160a01b0390911603611d51575f82815260048501602052604090205460a0820151611d1891600160b01b90046001600160401b0316906155e8565b6001600160401b0316421015611d4c5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611d57565b336112b6565b600281516005811115611d6c57611d6c614fb8565b03611e49578615611d8357611d8182876123c6565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611dbc918491611db79190615608565b6136ce565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611dfd84613825565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a31515945061169f9350505050565b600481516005811115611e5e57611e5e614fb8565b03611e9257611e6c83613825565b5f898152600686016020526040902055611e8588612c32565b600194505050505061169f565b805160405163170cc93360e21b815261063c919060040161514a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f61573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f889190810190615633565b9150915080611faa57604051636b2f19e960e01b815260040160405180910390fd5b815115611fd0578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b03161561200c576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461204857815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b60028110156120975761205f816001615705565b61206a906008615538565b61ffff16848281518110612080576120806151f5565b016020015160f81c901b919091179060010161204b565b5061ffff8116156120c15760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561211c576120d8816003615705565b6120e3906008615538565b63ffffffff16856120f58360026154ca565b81518110612105576121056151f5565b016020015160f81c901b91909117906001016120c4565b5063ffffffff81161561214257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121975761215981601f615705565b612164906008615538565b866121708360066154ca565b81518110612180576121806151f5565b016020015160f81c901b9190911790600101612145565b50949350505050565b60605f808335602085013560146121bc87870160408901615195565b6121c960608901896151b0565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61224f60608501856151b0565b905081101561200c578161226660608601866151b0565b83818110612276576122766151f5565b90506020028101906122889190615209565b6122929080615718565b90506122a160608701876151b0565b848181106122b1576122b16151f5565b90506020028101906122c39190615209565b6122cd9080615718565b6122da60608901896151b0565b868181106122ea576122ea6151f5565b90506020028101906122fc9190615209565b61230a906020810190615718565b61231760608b018b6151b0565b88818110612327576123276151f5565b90506020028101906123399190615209565b61234a906060810190604001614f3a565b604051602001612360979695949392919061575a565b60408051601f198184030181529190529150600101612242565b6123826139d1565b610f8081613a1c565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612411573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124389190810190615633565b915091508061245a57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561249d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124c1919061516a565b8251146124e7578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612523576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806125328460400151613a8a565b915091508187146125595760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615ac8833981519152906001600160401b039081169083161115612616575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612635565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615ac88339815191528161265986613c7b565b90506126648661238b565b6126735760019250505061169f565b5f8681526004830160205260409020546001600160a01b0316331461269857336112b6565b5f86815260048301602052604090205460a08201516126c791600160b01b90046001600160401b0316906155e8565b6001600160401b03168160c001516001600160401b0316101561270e5760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127265761271f87866123c6565b9050612744565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b590612769906111ee565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156127df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612803919061516a565b905080846007015f8a81526020019081526020015f205f82825461282791906154ca565b90915550501515979650505050505050565b5f80516020615b0883398151915280546001190161286a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612879614d96565b5f80516020615ae88339815191525f8061289561150587611efd565b9150915080156128bc57604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128ed576128ed614fb8565b60058111156128fe576128fe614fb8565b815260200160018201805461291290615118565b80601f016020809104026020016040519081016040528092919081815260200182805461293e90615118565b80156129895780601f1061296057610100808354040283529160200191612989565b820191905f5260205f20905b81548152906001019060200180831161296c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129f4576129f4614fb8565b14158015612a155750600181516005811115612a1257612a12614fb8565b14155b15612a3657805160405163170cc93360e21b815261063c919060040161514a565b600381516005811115612a4b57612a4b614fb8565b03612a595760048152612a5e565b600581525b836008018160200151604051612a7491906153a6565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612ab857612ab8614fb8565b021790555060208201516001820190612ad190826153fb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b7757612b77614fb8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612bfa575f80fd5b505af11580156110b2573d5f803e3d5ffd5b6114e56001600160a01b03831682613f5f565b60015f80516020615b0883398151915255565b5f8181525f80516020615aa88339815191526020526040808220815160e0810190925280545f80516020615ac883398151915293929190829060ff166003811115612c7f57612c7f614fb8565b6003811115612c9057612c90614fb8565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dbe575f84815260048701602052604090205461271090612d7090600160a01b900461ffff1685615538565b612d7a91906154ff565b915081866007015f8681526020019081526020015f205f828254612d9e91906154ca565b90915550612dae90508284615705565b9050612dbe856020015182612bae565b612dd38560200151610f6087606001516111ee565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e5057835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612e9f57612e67816001615705565b612e72906008615538565b61ffff16868281518110612e8857612e886151f5565b016020015160f81c901b9190911790600101612e53565b5061ffff811615612ec95760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f2457612ee0816003615705565b612eeb906008615538565b63ffffffff1687612efd8360026154ca565b81518110612f0d57612f0d6151f5565b016020015160f81c901b9190911790600101612ecc565b5063ffffffff8116600314612f4c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fa157612f6381601f615705565b612f6e906008615538565b88612f7a8360066154ca565b81518110612f8a57612f8a6151f5565b016020015160f81c901b9190911790600101612f4f565b505f805b600881101561300057612fb9816007615705565b612fc4906008615538565b6001600160401b031689612fd98360266154ca565b81518110612fe957612fe96151f5565b016020015160f81c901b9190911790600101612fa5565b505f805b600881101561305f57613018816007615705565b613023906008615538565b6001600160401b03168a61303883602e6154ca565b81518110613048576130486151f5565b016020015160f81c901b9190911790600101613004565b5091989097509095509350505050565b5f8082516027146130a557825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b60028110156130f4576130bc816001615705565b6130c7906008615538565b61ffff168582815181106130dd576130dd6151f5565b016020015160f81c901b91909117906001016130a8565b5061ffff81161561311e5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561317957613135816003615705565b613140906008615538565b63ffffffff16866131528360026154ca565b81518110613162576131626151f5565b016020015160f81c901b9190911790600101613121565b5063ffffffff81166002146131a157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131f6576131b881601f615705565b6131c3906008615538565b876131cf8360066154ca565b815181106131df576131df6151f5565b016020015160f81c901b91909117906001016131a4565b505f8660268151811061320b5761320b6151f5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615ac883398151915290600160401b900461ffff908116908616108061327f575061271061ffff8616115b156132a357604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b0390811690851610156132df576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806132f15750806001015483115b156133125760405163222d164360e21b81526004810184905260240161063c565b825f61331d82610ea0565b90505f61332a8983613ff2565b9050604051806080016040528061333e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615ac88339815191528161341284610ea0565b90505f61341e876119fd565b90506134298761238b565b613449576040516330efa98b60e01b81526004810188905260240161063c565b60028151600581111561345e5761345e614fb8565b1461347f57805160405163170cc93360e21b815261063c919060040161514a565b5f82826080015161349091906155e8565b905083600201600a9054906101000a90046001600160401b031682604001516134b991906157c3565b6001600160401b0316816001600160401b031611156134f657604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135028a846136ce565b915091505f8a8360405160200161353092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135c3576135c3614fb8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615b28833981519152602052604081206002015481905f80516020615ae883398151915290600160801b90046001600160401b0316613716858261456a565b5f61372087614744565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137708a858b611eae565b6040518263ffffffff1660e01b815260040161378c9190615158565b6020604051808303815f875af11580156137a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137cc919061516a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615ac883398151915290505f61384584604001516119fd565b90505f60038251600581111561385d5761385d614fb8565b148061387b575060048251600581111561387957613879614fb8565b145b1561388b575060c08101516138c8565b6002825160058111156138a0576138a0614fb8565b036138ac5750426138c8565b815160405163170cc93360e21b815261063c919060040161514a565b84608001516001600160401b0316816001600160401b0316116138ef57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613914906111ee565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156139a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139c8919061516a565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a1a57604051631afcd79f60e31b815260040160405180910390fd5b565b613a246139d1565b613a2d816147b9565b613a356147d2565b610f8060608201356080830135613a5260c0850160a08601614f3a565b613a6260e0860160c087016157ee565b613a73610100870160e08801615807565b613a8561012088016101008901615195565b6147e2565b5f808251602e14613ac057825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b0f57613ad7816001615705565b613ae2906008615538565b61ffff16858281518110613af857613af86151f5565b016020015160f81c901b9190911790600101613ac3565b5061ffff811615613b395760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b9457613b50816003615705565b613b5b906008615538565b63ffffffff1686613b6d8360026154ca565b81518110613b7d57613b7d6151f5565b016020015160f81c901b9190911790600101613b3c565b5063ffffffff811615613bba57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c0f57613bd181601f615705565b613bdc906008615538565b87613be88360066154ca565b81518110613bf857613bf86151f5565b016020015160f81c901b9190911790600101613bbd565b505f805b6008811015613c6e57613c27816007615705565b613c32906008615538565b6001600160401b031688613c478360266154ca565b81518110613c5757613c576151f5565b016020015160f81c901b9190911790600101613c13565b5090969095509350505050565b613c83614d96565b5f8281525f80516020615b288339815191526020526040808220815160e0810190925280545f80516020615ae883398151915293929190829060ff166005811115613cd057613cd0614fb8565b6005811115613ce157613ce1614fb8565b8152602001600182018054613cf590615118565b80601f0160208091040260200160405190810160405280929190818152602001828054613d2190615118565b8015613d6c5780601f10613d4357610100808354040283529160200191613d6c565b820191905f5260205f20905b815481529060010190602001808311613d4f57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dda57613dda614fb8565b14613e0d575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161514a565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e5157613e51614fb8565b021790555060208201516001820190613e6a90826153fb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f0885826136ce565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f825760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fcb576040519150601f19603f3d011682016040523d82523d5f602084013e613fd0565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661403657604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ae8833981519152426140556060860160408701614f3a565b6001600160401b031611158061408f57506140736202a300426154ca565b6140836060860160408701614f3a565b6001600160401b031610155b156140c9576140a46060850160408601614f3a565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6140de6140d96060860186615827565b614911565b6140ee6140d96080860186615827565b60306140fd6020860186615718565b90501461412f576141116020850185615718565b6040516326475b2f60e11b815261063c925060040190815260200190565b6141398480615718565b90505f036141665761414b8480615718565b604051633e08a12560e11b815260040161063c92919061583b565b5f600882016141758680615718565b6040516141839291906155d9565b908152602001604051809103902054146141bc576141a18480615718565b60405163a41f772f60e01b815260040161063c92919061583b565b6141c6835f61456a565b6040805160e08101909152815481525f9081906142d290602081016141eb8980615718565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614233908a018a615718565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161427c60608a0160408b01614f3a565b6001600160401b0316815260200161429760608a018a615827565b6142a090615869565b81526020016142b260808a018a615827565b6142bb90615869565b8152602001876001600160401b0316815250614a7a565b5f828152600686016020526040902091935091506142f082826153fb565b5081600884016143008880615718565b60405161430e9291906155d9565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061434a908590600401615158565b6020604051808303815f875af1158015614366573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061438a919061516a565b6040805160e0810190915290915080600181526020016143aa8980615718565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561443957614439614fb8565b02179055506020820151600182019061445290826153fb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144f08880615718565b6040516144fe9291906155d9565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061453c9190614f3a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615ae88339815191525f6001600160401b03808416908516111561459e576145978385615608565b90506145ab565b6145a88484615608565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061460d575060018401548151614609916001600160401b0316906154ca565b8210155b15614633576001600160401b038316606082015281815260408101516020820152614652565b828160600181815161464591906155e8565b6001600160401b03169052505b60608101516146629060646157c3565b602082015160018601546001600160401b03929092169161468d9190600160401b900460ff16615538565b10156146bd57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b0316816040018181516146d891906154ca565b9052506040810180516001600160401b03871691906146f8908390615705565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615b288339815191526020526040812060020180545f80516020615ae8833981519152919060089061478e90600160401b90046001600160401b0316615930565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147c16139d1565b6147c9614c67565b610f8081614c6f565b6147da6139d1565b613a1a614d57565b6147ea6139d1565b5f80516020615ac883398151915261ffff8416158061480e575061271061ffff8516115b1561483257604051635f12e6c360e11b815261ffff8516600482015260240161063c565b858711156148565760405163222d164360e21b81526004810188905260240161063c565b60ff831615806148695750600a60ff8416115b1561488c5760405163170db35960e31b815260ff8416600482015260240161063c565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b61491e6020820182614ee3565b63ffffffff1615801561493e575061493960208201826151b0565b151590505b15614985576149506020820182614ee3565b61495d60208301836151b0565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b61499260208201826151b0565b90506149a16020830183614ee3565b63ffffffff1611156149ba576149506020820182614ee3565b60015b6149ca60208301836151b0565b90508110156114e5576149e060208301836151b0565b6149eb600184615705565b8181106149fa576149fa6151f5565b9050602002016020810190614a0f9190615195565b6001600160a01b0316614a2560208401846151b0565b83818110614a3557614a356151f5565b9050602002016020810190614a4a9190615195565b6001600160a01b03161015614a7257604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149bd565b5f6060826040015151603014614aa35760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614ae4988a98600198929792969095909490939092910161594b565b60405160208183030381529060405290505f5b84608001516020015151811015614b5657818560800151602001518281518110614b2357614b236151f5565b6020026020010151604051602001614b3c929190615a05565b60408051601f198184030181529190529150600101614af7565b5060a0840151805160209182015151604051614b76938593929101615a3b565b60405160208183030381529060405290505f5b8460a001516020015151811015614be857818560a00151602001518281518110614bb557614bb56151f5565b6020026020010151604051602001614bce929190615a05565b60408051601f198184030181529190529150600101614b89565b5060c0840151604051614bff918391602001615a76565b6040516020818303038152906040529050600281604051614c2091906153a6565b602060405180830381855afa158015614c3b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c5e919061516a565b94909350915050565b613a1a6139d1565b614c776139d1565b80355f80516020615ae88339815191529081556014614c9c6060840160408501615807565b60ff161180614cbb5750614cb66060830160408401615807565b60ff16155b15614cef57614cd06060830160408401615807565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614cff6060830160408401615807565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d306040830160208401614f3a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c1f6139d1565b508054614d6b90615118565b5f825580601f10614d7a575050565b601f0160209004905f5260205f2090810190610f809190614dd3565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614de7575f8155600101614dd4565b5090565b8015158114610f80575f80fd5b803563ffffffff811681146119f8575f80fd5b5f805f60608486031215614e1d575f80fd5b833592506020840135614e2f81614deb565b9150614e3d60408501614df8565b90509250925092565b5f60208284031215614e56575f80fd5b5035919050565b5f8060408385031215614e6e575f80fd5b82356001600160401b03811115614e83575f80fd5b830160808186031215614e94575f80fd5b9150614ea260208401614df8565b90509250929050565b5f6101208284031215614ebc575f80fd5b50919050565b5f8060408385031215614ed3575f80fd5b82359150614ea260208401614df8565b5f60208284031215614ef3575f80fd5b61169f82614df8565b5f8060408385031215614f0d575f80fd5b614f1683614df8565b946020939093013593505050565b80356001600160401b03811681146119f8575f80fd5b5f60208284031215614f4a575f80fd5b61169f82614f24565b803561ffff811681146119f8575f80fd5b5f805f60608486031215614f76575f80fd5b83356001600160401b03811115614f8b575f80fd5b840160a08187031215614f9c575f80fd5b9250614faa60208501614f53565b9150614e3d60408501614f24565b634e487b7160e01b5f52602160045260245ffd5b60068110614fdc57614fdc614fb8565b9052565b5f5b83811015614ffa578181015183820152602001614fe2565b50505f910152565b5f8151808452615019816020860160208601614fe0565b601f01601f19169290920160200192915050565b6020815261503f602082018351614fcc565b5f602083015160e0604084015261505a610100840182615002565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150be575f80fd5b82356001600160401b03808211156150d4575f80fd5b818501915085601f8301126150e7575f80fd5b8135818111156150f5575f80fd5b866020828501011115615106575f80fd5b60209290920196919550909350505050565b600181811c9082168061512c57607f821691505b602082108103614ebc57634e487b7160e01b5f52602260045260245ffd5b60208101610eb08284614fcc565b602081525f61169f6020830184615002565b5f6020828403121561517a575f80fd5b5051919050565b6001600160a01b0381168114610f80575f80fd5b5f602082840312156151a5575f80fd5b813561169f81615181565b5f808335601e198436030181126151c5575f80fd5b8301803591506001600160401b038211156151de575f80fd5b6020019150600581901b360382131561381e575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261521d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561525d5761525d615227565b60405290565b604080519081016001600160401b038111828210171561525d5761525d615227565b604051601f8201601f191681016001600160401b03811182821017156152ad576152ad615227565b604052919050565b5f6001600160401b038211156152cd576152cd615227565b50601f01601f191660200190565b5f82601f8301126152ea575f80fd5b81356152fd6152f8826152b5565b615285565b818152846020838601011115615311575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561533d575f80fd5b61534561523b565b82356001600160401b038082111561535b575f80fd5b615367368387016152db565b8352602085013591508082111561537c575f80fd5b50615389368286016152db565b60208301525061539b60408401614f24565b604082015292915050565b5f825161521d818460208701614fe0565b601f82111561064557805f5260205f20601f840160051c810160208510156153dc5750805b601f840160051c820191505b81811015611888575f81556001016153e8565b81516001600160401b0381111561541457615414615227565b615428816154228454615118565b846153b7565b602080601f83116001811461545b575f84156154445750858301515b5f19600386901b1c1916600185901b1785556110b2565b5f85815260208120601f198616915b828110156154895788860151825594840194600190910190840161546a565b50858210156154a657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610eb057610eb06154b6565b5f63ffffffff8083168181036154f5576154f56154b6565b6001019392505050565b5f8261551957634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061553257615532614fb8565b91905290565b8082028115828204841417610eb057610eb06154b6565b5f60208083525f845461556181615118565b806020870152604060018084165f8114615582576001811461559e576155cb565b60ff19851660408a0152604084151560051b8a010195506155cb565b895f5260205f205f5b858110156155c25781548b82018601529083019088016155a7565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561200c5761200c6154b6565b6001600160401b0382811682821603908082111561200c5761200c6154b6565b80516119f881614deb565b5f8060408385031215615644575f80fd5b82516001600160401b038082111561565a575f80fd5b908401906060828703121561566d575f80fd5b61567561523b565b8251815260208084015161568881615181565b8282015260408401518381111561569d575f80fd5b80850194505087601f8501126156b1575f80fd5b835192506156c16152f8846152b5565b83815288828587010111156156d4575f80fd5b6156e384838301848801614fe0565b806040840152508195506156f8818801615628565b9450505050509250929050565b81810381811115610eb057610eb06154b6565b5f808335601e1984360301811261572d575f80fd5b8301803591506001600160401b03821115615746575f80fd5b60200191503681900382131561381e575f80fd5b5f885161576b818460208d01614fe0565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146157e6576157e66154b6565b505092915050565b5f602082840312156157fe575f80fd5b61169f82614f53565b5f60208284031215615817575f80fd5b813560ff8116811461169f575f80fd5b5f8235603e1983360301811261521d575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615879575f80fd5b615881615263565b61588a83614df8565b81526020808401356001600160401b03808211156158a6575f80fd5b9085019036601f8301126158b8575f80fd5b8135818111156158ca576158ca615227565b8060051b91506158db848301615285565b81815291830184019184810190368411156158f4575f80fd5b938501935b8385101561591e578435925061590e83615181565b82825293850193908501906158f9565b94860194909452509295945050505050565b5f6001600160401b038083168181036154f5576154f56154b6565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161599181602a850160208b01614fe0565b8651908301906159a881602a840160208b01614fe0565b60c087901b6001600160c01b031916602a92909101918201526159da603282018660e01b6001600160e01b0319169052565b6159f3603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a16818460208801614fe0565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615a4c818460208901614fe0565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615a87818460208801614fe0565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -292,6 +292,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ADDRES return _NativeTokenStakingManager.Contract.ADDRESSLENGTH(&_NativeTokenStakingManager.CallOpts) } +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) BIPSCONVERSIONFACTOR(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "BIPS_CONVERSION_FACTOR") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) BIPSCONVERSIONFACTOR() (uint16, error) { + return _NativeTokenStakingManager.Contract.BIPSCONVERSIONFACTOR(&_NativeTokenStakingManager.CallOpts) +} + +// BIPSCONVERSIONFACTOR is a free data retrieval call binding the contract method 0xa9778a7a. +// +// Solidity: function BIPS_CONVERSION_FACTOR() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) BIPSCONVERSIONFACTOR() (uint16, error) { + return _NativeTokenStakingManager.Contract.BIPSCONVERSIONFACTOR(&_NativeTokenStakingManager.CallOpts) +} + // BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. // // Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) diff --git a/contracts/validator-manager/ExampleRewardCalculator.sol b/contracts/validator-manager/ExampleRewardCalculator.sol index 79740d61a..839bdf422 100644 --- a/contracts/validator-manager/ExampleRewardCalculator.sol +++ b/contracts/validator-manager/ExampleRewardCalculator.sol @@ -12,6 +12,8 @@ contract ExampleRewardCalculator is IRewardCalculator { uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; + uint16 public constant BIPS_CONVERSION_FACTOR = 10000; + uint64 public immutable rewardBasisPoints; constructor(uint64 rewardBasisPoints_) { @@ -40,6 +42,6 @@ contract ExampleRewardCalculator is IRewardCalculator { } return (stakeAmount * rewardBasisPoints * (stakingEndTime - stakingStartTime)) - / SECONDS_IN_YEAR / 10000; + / SECONDS_IN_YEAR / BIPS_CONVERSION_FACTOR; } } diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 20f8f3cf6..f4e00a7bb 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -75,6 +75,8 @@ abstract contract PoSValidatorManager is uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; + uint16 public constant BIPS_CONVERSION_FACTOR = 10000; + error InvalidDelegationFee(uint16 delegationFeeBips); error InvalidDelegationID(bytes32 delegationID); error InvalidDelegatorStatus(DelegatorStatus status); @@ -656,7 +658,8 @@ abstract contract PoSValidatorManager is uint256 validatorFees; uint256 delegatorRewards; if (rewards > 0) { - validatorFees = rewards * $._posValidatorInfo[validationID].delegationFeeBips / 10000; + validatorFees = rewards * $._posValidatorInfo[validationID].delegationFeeBips + / BIPS_CONVERSION_FACTOR; // Allocate the delegation fees to the validator. $._redeemableValidatorRewards[validationID] += validatorFees; From b58287c385e287065dada0fb35fad63109b37dcc Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 09:22:05 -0400 Subject: [PATCH 05/35] Remove unused parameters in rewards calculator --- .../ERC20TokenStakingManager.go | 2 +- .../ExampleRewardCalculator.go | 28 +++++++++---------- .../NativeTokenStakingManager.go | 2 +- .../ExampleRewardCalculator.sol | 4 +-- .../validator-manager/PoSValidatorManager.sol | 8 ++---- .../interfaces/IRewardCalculator.sol | 6 +--- .../tests/ExamplesRewardCalculatorTests.t.sol | 8 ++---- .../tests/PoSValidatorManagerTests.t.sol | 28 +++++-------------- 8 files changed, 29 insertions(+), 57 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index c6cd32649..f366e5583 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -91,7 +91,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f8b380380615f8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e3e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b61020961020436600461505c565b6104a8565b005b610209610219366004615097565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b36600461505c565b6106eb565b61020961025e3660046150ae565b6106f6565b6102096102713660046150fc565b610be2565b610289610284366004615097565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb36600461505c565b610c6c565b6102096102de36600461511d565b610c77565b6102f66102f136600461515d565b610d39565b604051908152602001610234565b6102096103123660046151c2565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f66103423660046151ea565b610fd9565b610289610355366004615097565b610ff2565b6102f65f81565b61020961036f36600461505c565b611006565b610226603081565b61020961038a366004615097565b611031565b61020961039d3660046151c2565b6110fc565b6102f66103b0366004615203565b6112d4565b6102096103c336600461511d565b611300565b6102f65f80516020615db283398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004615097565b611489565b6102f65f80516020615dd283398151915281565b610209610437366004615097565b611672565b610226601481565b610457610452366004615097565b6117af565b6040516102349190615298565b6102896202a30081565b6102f65f80516020615d9283398151915281565b61020961049036600461532c565b6118fe565b6102f66104a336600461536a565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff16600581111561052a5761052a615223565b600581111561053b5761053b615223565b815260200160018201805461054f906153d5565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906153d5565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063157610631615223565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d46565b6040518263ffffffff1660e01b81526004016106a5919061541b565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e5919061542d565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615dd28339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af919061542d565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e96060850160408601615444565b6001600160a01b03161461082c576108076060840160408501615444565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a606085018561545f565b905090505f805b828163ffffffff161015610b22575f61085d606088018861545f565b8363ffffffff16818110610873576108736154a4565b905060200281019061088591906154b8565b61088e906155dc565b80516040519192505f9160088801916108a691615655565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf919060040161541b565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f91615655565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d919061542d565b90508086600801835f01516040516109759190615655565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f7615223565b021790555060208201516001820190610a1090826156aa565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab5911685615779565b8251604051919550610ac691615655565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b9061578c565b9050610841565b50600483018190555f610b40610b3786611d95565b60400151611eab565b90505f610b4c87612038565b90505f600282604051610b5f9190615655565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d919061542d565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612212565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c615223565b14610c4c578060405163170cc93360e21b81526004016104cf919061540d565b6106e5838361224d565b5f610c6664e8d4a51000836157ae565b92915050565b6106e58383836124c7565b610c7f6126c0565b5f80516020615db28339815191525f80610c98846126f7565b91509150610ca582612212565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce0615223565b03610d05575f83815260078501602052604081208054919055610d038282612a35565b505b610d1b81610d168460400151610fd9565b612aab565b505050505b610d3660015f80516020615df283398151915255565b50565b5f610d426126c0565b610d4e85858585612ae1565b9050610d6660015f80516020615df283398151915255565b949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115610dbb57610dbb615223565b6003811115610dcc57610dcc615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e59615223565b14610e7a578251604051633b0d540d60e21b81526104cf91906004016157cd565b600481516005811115610e8f57610e8f615223565b03610ea557610e9d85612cba565b505050505050565b5f80610ebc610eb389611d95565b60400151612ea1565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a510006157e7565b5f610ffc826117af565b6080015192915050565b6110118383836124c7565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615db28339815191525f611049836117af565b519050600481600581111561106057611060615223565b14611080578060405163170cc93360e21b81526004016104cf919061540d565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a35565b6111046126c0565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff16600381111561115157611151615223565b600381111561116257611162615223565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db615223565b146111fc578051604051633b0d540d60e21b81526104cf91906004016157cd565b600461120b82604001516117af565b51600581111561121d5761121d615223565b146112af575f61122c85611d95565b90505f8061123d8360400151612ea1565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612cba565b50506112d060015f80516020615df283398151915255565b5050565b5f6112dd6126c0565b6112e88333846130f7565b9050610c6660015f80516020615df283398151915255565b5f80516020615dd28339815191525f8061132561131c85611d95565b604001516133cf565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f82815260068401602052604090208054611365906153d5565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af615223565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068401602052604081206113fa91614fab565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff1660038111156114d6576114d6615223565b60038111156114e7576114e7615223565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561156057611560615223565b14158015611581575060038151600381111561157e5761157e615223565b14155b156115a2578051604051633b0d540d60e21b81526104cf91906004016157cd565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d46565b6040518263ffffffff1660e01b815260040161162b919061541b565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b919061542d565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615dd283398151915291906116b9906153d5565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff16600581111561170357611703615223565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016157fe565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d8919061542d565b6117b7614fe2565b5f8281525f80516020615e12833981519152602052604090819020815160e0810190925280545f80516020615dd2833981519152929190829060ff16600581111561180457611804615223565b600581111561181557611815615223565b8152602001600182018054611829906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611855906153d5565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611990848461358b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615dd2833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615888565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db28339815191529284929091829060ff166003811115611a8657611a86615223565b6003811115611a9757611a97615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b24615223565b14611b45578251604051633b0d540d60e21b81526104cf91906004016157cd565b60208301516001600160a01b03163314611be8575f828152600485016020526040902054336001600160a01b0390911603611be2575f82815260048501602052604090205460a0820151611ba991600160b01b90046001600160401b031690615897565b6001600160401b0316421015611bdd5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b611be8565b336110a1565b600281516005811115611bfd57611bfd615223565b03611cda578615611c1457611c12828761224d565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c4d918491611c4891906158b7565b6135a5565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c8e846136fc565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d3f9350505050565b600481516005811115611cef57611cef615223565b03611d2357611cfd836136fc565b5f898152600686016020526040902055611d1688612cba565b6001945050505050611d3f565b805160405163170cc93360e21b81526104cf919060040161540d565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e2091908101906158e2565b9150915080611e4257604051636b2f19e960e01b815260040160405180910390fd5b815115611e68578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611ea4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611ee057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f2f57611ef78160016159b4565b611f029060086157e7565b61ffff16848281518110611f1857611f186154a4565b016020015160f81c901b9190911790600101611ee3565b5061ffff811615611f595760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611fb457611f708160036159b4565b611f7b9060086157e7565b63ffffffff1685611f8d836002615779565b81518110611f9d57611f9d6154a4565b016020015160f81c901b9190911790600101611f5c565b5063ffffffff811615611fda57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561202f57611ff181601f6159b4565b611ffc9060086157e7565b86612008836006615779565b81518110612018576120186154a4565b016020015160f81c901b9190911790600101611fdd565b50949350505050565b60605f8083356020850135601461205487870160408901615444565b612061606089018961545f565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6120e7606085018561545f565b9050811015611ea457816120fe606086018661545f565b8381811061210e5761210e6154a4565b905060200281019061212091906154b8565b61212a90806159c7565b9050612139606087018761545f565b84818110612149576121496154a4565b905060200281019061215b91906154b8565b61216590806159c7565b612172606089018961545f565b86818110612182576121826154a4565b905060200281019061219491906154b8565b6121a29060208101906159c7565b6121af60608b018b61545f565b888181106121bf576121bf6154a4565b90506020028101906121d191906154b8565b6121e29060608101906040016151ea565b6040516020016121f89796959493929190615a09565b60408051601f1981840301815291905291506001016120da565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612298573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122bf91908101906158e2565b91509150806122e157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612324573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612348919061542d565b82511461236e578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123aa576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f806123b984604001516138a8565b915091508187146123e05760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615db2833981519152906001600160401b03908116908316111561249d575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26124bc565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615db2833981519152816124e086613a99565b90506124eb86612212565b6124fa57600192505050611d3f565b5f8681526004830160205260409020546001600160a01b0316331461251f57336110a1565b5f86815260048301602052604090205460a082015161254e91600160b01b90046001600160401b031690615897565b6001600160401b03168160c001516001600160401b031610156125955760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125ad576125a6878661224d565b90506125cb565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906125f090610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268a919061542d565b905080846007015f8a81526020019081526020015f205f8282546126ae9190615779565b90915550501515979650505050505050565b5f80516020615df28339815191528054600119016126f157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612700614fe2565b5f80516020615dd28339815191525f8061271c61131c87611d95565b91509150801561274357604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561277457612774615223565b600581111561278557612785615223565b8152602001600182018054612799906153d5565b80601f01602080910402602001604051908101604052809291908181526020018280546127c5906153d5565b80156128105780601f106127e757610100808354040283529160200191612810565b820191905f5260205f20905b8154815290600101906020018083116127f357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561287b5761287b615223565b1415801561289c575060018151600581111561289957612899615223565b14155b156128bd57805160405163170cc93360e21b81526104cf919060040161540d565b6003815160058111156128d2576128d2615223565b036128e057600481526128e5565b600581525b8360080181602001516040516128fb9190615655565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561293f5761293f615223565b02179055506020820151600182019061295890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129fe576129fe615223565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a90575f80fd5b505af1158015612aa2573d5f803e3d5ffd5b50505050505050565b5f80516020615d92833981519152546112d0906001600160a01b03168383613d7d565b60015f80516020615df283398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615db283398151915290600160401b900461ffff9081169086161080612b35575061271061ffff8616115b15612b5957604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b95576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612ba75750806001015483115b15612bc85760405163222d164360e21b8152600481018490526024016104cf565b5f612bd284613ddc565b90505f612bde82610c56565b90505f612beb8983613dff565b90506040518060800160405280612bff3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115612d0757612d07615223565b6003811115612d1857612d18615223565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e46575f84815260048701602052604090205461271090612df890600160a01b900461ffff16856157e7565b612e0291906157ae565b915081866007015f8681526020019081526020015f205f828254612e269190615779565b90915550612e36905082846159b4565b9050612e46856020015182612a35565b612e5b8560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ed857835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f2757612eef8160016159b4565b612efa9060086157e7565b61ffff16868281518110612f1057612f106154a4565b016020015160f81c901b9190911790600101612edb565b5061ffff811615612f515760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612fac57612f688160036159b4565b612f739060086157e7565b63ffffffff1687612f85836002615779565b81518110612f9557612f956154a4565b016020015160f81c901b9190911790600101612f54565b5063ffffffff8116600314612fd457604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561302957612feb81601f6159b4565b612ff69060086157e7565b88613002836006615779565b81518110613012576130126154a4565b016020015160f81c901b9190911790600101612fd7565b505f805b6008811015613088576130418160076159b4565b61304c9060086157e7565b6001600160401b031689613061836026615779565b81518110613071576130716154a4565b016020015160f81c901b919091179060010161302d565b505f805b60088110156130e7576130a08160076159b4565b6130ab9060086157e7565b6001600160401b03168a6130c083602e615779565b815181106130d0576130d06154a4565b016020015160f81c901b919091179060010161308c565b5091989097509095509350505050565b5f5f80516020615db28339815191528161311361028485613ddc565b90505f61311f876117af565b905061312a87612212565b61314a576040516330efa98b60e01b8152600481018890526024016104cf565b60028151600581111561315f5761315f615223565b1461318057805160405163170cc93360e21b81526104cf919060040161540d565b5f8282608001516131919190615897565b905083600201600a9054906101000a90046001600160401b031682604001516131ba9190615a72565b6001600160401b0316816001600160401b031611156131f757604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806132038a846135a5565b915091505f8a8360405160200161323192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132c4576132c4615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461340557825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156134545761341c8160016159b4565b6134279060086157e7565b61ffff1685828151811061343d5761343d6154a4565b016020015160f81c901b9190911790600101613408565b5061ffff81161561347e5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134d9576134958160036159b4565b6134a09060086157e7565b63ffffffff16866134b2836002615779565b815181106134c2576134c26154a4565b016020015160f81c901b9190911790600101613481565b5063ffffffff811660021461350157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135565761351881601f6159b4565b6135239060086157e7565b8761352f836006615779565b8151811061353f5761353f6154a4565b016020015160f81c901b9190911790600101613504565b505f8660268151811061356b5761356b6154a4565b016020015191976001600160f81b03199092161515965090945050505050565b613593614377565b61359c826143c2565b6112d081614430565b5f8281525f80516020615e12833981519152602052604081206002015481905f80516020615dd283398151915290600160801b90046001600160401b03166135ed8582614498565b5f6135f787614672565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136478a858b611d46565b6040518263ffffffff1660e01b8152600401613663919061541b565b6020604051808303815f875af115801561367f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a3919061542d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615db283398151915290505f61371c84604001516117af565b90505f60038251600581111561373457613734615223565b1480613752575060048251600581111561375057613750615223565b145b15613762575060c081015161379f565b60028251600581111561377757613777615223565b0361378357504261379f565b815160405163170cc93360e21b81526104cf919060040161540d565b84608001516001600160401b0316816001600160401b0316116137c657505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137eb90610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561387b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061389f919061542d565b95945050505050565b5f808251602e146138de57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b600281101561392d576138f58160016159b4565b6139009060086157e7565b61ffff16858281518110613916576139166154a4565b016020015160f81c901b91909117906001016138e1565b5061ffff8116156139575760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139b25761396e8160036159b4565b6139799060086157e7565b63ffffffff168661398b836002615779565b8151811061399b5761399b6154a4565b016020015160f81c901b919091179060010161395a565b5063ffffffff8116156139d857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a2d576139ef81601f6159b4565b6139fa9060086157e7565b87613a06836006615779565b81518110613a1657613a166154a4565b016020015160f81c901b91909117906001016139db565b505f805b6008811015613a8c57613a458160076159b4565b613a509060086157e7565b6001600160401b031688613a65836026615779565b81518110613a7557613a756154a4565b016020015160f81c901b9190911790600101613a31565b5090969095509350505050565b613aa1614fe2565b5f8281525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff166005811115613aee57613aee615223565b6005811115613aff57613aff615223565b8152602001600182018054613b13906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054613b3f906153d5565b8015613b8a5780601f10613b6157610100808354040283529160200191613b8a565b820191905f5260205f20905b815481529060010190602001808311613b6d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613bf857613bf8615223565b14613c2b575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c6f57613c6f615223565b021790555060208201516001820190613c8890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d2685826135a5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146e7565b5f610c66825f80516020615d92833981519152546001600160a01b031690614748565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e4357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615dd283398151915242613e6260608601604087016151ea565b6001600160401b0316111580613e9c5750613e806202a30042615779565b613e9060608601604087016151ea565b6001600160401b031610155b15613ed657613eb160608501604086016151ea565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613eeb613ee66060860186615a9d565b6148a1565b613efb613ee66080860186615a9d565b6030613f0a60208601866159c7565b905014613f3c57613f1e60208501856159c7565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f4684806159c7565b90505f03613f7357613f5884806159c7565b604051633e08a12560e11b81526004016104cf929190615ab1565b5f60088201613f8286806159c7565b604051613f90929190615888565b90815260200160405180910390205414613fc957613fae84806159c7565b60405163a41f772f60e01b81526004016104cf929190615ab1565b613fd3835f614498565b6040805160e08101909152815481525f9081906140df9060208101613ff889806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614040908a018a6159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161408960608a0160408b016151ea565b6001600160401b031681526020016140a460608a018a615a9d565b6140ad90615adf565b81526020016140bf60808a018a615a9d565b6140c890615adf565b8152602001876001600160401b0316815250614a0a565b5f828152600686016020526040902091935091506140fd82826156aa565b50816008840161410d88806159c7565b60405161411b929190615888565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061415790859060040161541b565b6020604051808303815f875af1158015614173573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614197919061542d565b6040805160e0810190915290915080600181526020016141b789806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561424657614246615223565b02179055506020820151600182019061425f90826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806142fd88806159c7565b60405161430b929190615888565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061434991906151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143c057604051631afcd79f60e31b815260040160405180910390fd5b565b6143ca614377565b6143d381614bf7565b6143db614c10565b610d36606082013560808301356143f860c0850160a086016151ea565b61440860e0860160c08701615ba6565b614419610100870160e08801615bbf565b61442b61012088016101008901615444565b614c20565b614438614377565b5f80516020615d928339815191526001600160a01b03821661447857604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615dd28339815191525f6001600160401b0380841690851611156144cc576144c583856158b7565b90506144d9565b6144d684846158b7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061453b575060018401548151614537916001600160401b031690615779565b8210155b15614561576001600160401b038316606082015281815260408101516020820152614580565b82816060018181516145739190615897565b6001600160401b03169052505b6060810151614590906064615a72565b602082015160018601546001600160401b0392909216916145bb9190600160401b900460ff166157e7565b10156145eb57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516146069190615779565b9052506040810180516001600160401b03871691906146269083906159b4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615e128339815191526020526040812060020180545f80516020615dd283398151915291906008906146bc90600160401b90046001600160401b0316615bdf565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146fb6001600160a01b03841683614d4f565b905080515f1415801561471f57508080602001905181019061471d9190615bfa565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561478e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147b2919061542d565b90506147c96001600160a01b038516333086614d5c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561480d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614831919061542d565b90508181116148975760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b61389f82826159b4565b6148ae602082018261511d565b63ffffffff161580156148ce57506148c9602082018261545f565b151590505b15614915576148e0602082018261511d565b6148ed602083018361545f565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b614922602082018261545f565b9050614931602083018361511d565b63ffffffff16111561494a576148e0602082018261511d565b60015b61495a602083018361545f565b90508110156112d057614970602083018361545f565b61497b6001846159b4565b81811061498a5761498a6154a4565b905060200201602081019061499f9190615444565b6001600160a01b03166149b5602084018461545f565b838181106149c5576149c56154a4565b90506020020160208101906149da9190615444565b6001600160a01b03161015614a0257604051630dbc8d5f60e31b815260040160405180910390fd5b60010161494d565b5f6060826040015151603014614a335760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a74988a986001989297929690959094909390929101615c15565b60405160208183030381529060405290505f5b84608001516020015151811015614ae657818560800151602001518281518110614ab357614ab36154a4565b6020026020010151604051602001614acc929190615ccf565b60408051601f198184030181529190529150600101614a87565b5060a0840151805160209182015151604051614b06938593929101615d05565b60405160208183030381529060405290505f5b8460a001516020015151811015614b7857818560a00151602001518281518110614b4557614b456154a4565b6020026020010151604051602001614b5e929190615ccf565b60408051601f198184030181529190529150600101614b19565b5060c0840151604051614b8f918391602001615d40565b6040516020818303038152906040529050600281604051614bb09190615655565b602060405180830381855afa158015614bcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bee919061542d565b94909350915050565b614bff614377565b614c07614d95565b610d3681614d9d565b614c18614377565b6143c0614e85565b614c28614377565b5f80516020615db283398151915261ffff84161580614c4c575061271061ffff8516115b15614c7057604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c945760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614ca75750600a60ff8416115b15614cca5760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d3f83835f614e8d565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613daa565b6143c0614377565b614da5614377565b80355f80516020615dd28339815191529081556014614dca6060840160408501615bbf565b60ff161180614de95750614de46060830160408401615bbf565b60ff16155b15614e1d57614dfe6060830160408401615bbf565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614e2d6060830160408401615bbf565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e5e60408301602084016151ea565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ace614377565b606081471015614eb25760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614ecd9190615655565b5f6040518083038185875af1925050503d805f8114614f07576040519150601f19603f3d011682016040523d82523d5f602084013e614f0c565b606091505b5091509150614f1c868383614f26565b9695505050505050565b606082614f3b57614f3682614f82565b611d3f565b8151158015614f5257506001600160a01b0384163b155b15614f7b57604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d3f565b805115614f925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614fb7906153d5565b5f825580601f10614fc6575050565b601f0160209004905f5260205f2090810190610d36919061501f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615033575f8155600101615020565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114615057575f80fd5b919050565b5f805f6060848603121561506e575f80fd5b83359250602084013561508081615037565b915061508e60408501615044565b90509250925092565b5f602082840312156150a7575f80fd5b5035919050565b5f80604083850312156150bf575f80fd5b82356001600160401b038111156150d4575f80fd5b8301608081860312156150e5575f80fd5b91506150f360208401615044565b90509250929050565b5f806040838503121561510d575f80fd5b823591506150f360208401615044565b5f6020828403121561512d575f80fd5b611d3f82615044565b803561ffff81168114615057575f80fd5b80356001600160401b0381168114615057575f80fd5b5f805f8060808587031215615170575f80fd5b84356001600160401b03811115615185575f80fd5b850160a08188031215615196575f80fd5b93506151a460208601615136565b92506151b260408601615147565b9396929550929360600135925050565b5f80604083850312156151d3575f80fd5b6151dc83615044565b946020939093013593505050565b5f602082840312156151fa575f80fd5b611d3f82615147565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061524757615247615223565b9052565b5f5b8381101561526557818101518382015260200161524d565b50505f910152565b5f815180845261528481602086016020860161524b565b601f01601f19169290920160200192915050565b602081526152aa602082018351615237565b5f602083015160e060408401526152c561010084018261526d565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f8082840361014081121561533f575f80fd5b6101208082121561534e575f80fd5b849350830135905061535f81615318565b809150509250929050565b5f806020838503121561537b575f80fd5b82356001600160401b0380821115615391575f80fd5b818501915085601f8301126153a4575f80fd5b8135818111156153b2575f80fd5b8660208285010111156153c3575f80fd5b60209290920196919550909350505050565b600181811c908216806153e957607f821691505b60208210810361540757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c668284615237565b602081525f611d3f602083018461526d565b5f6020828403121561543d575f80fd5b5051919050565b5f60208284031215615454575f80fd5b8135611d3f81615318565b5f808335601e19843603018112615474575f80fd5b8301803591506001600160401b0382111561548d575f80fd5b6020019150600581901b36038213156136f5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154cc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561550c5761550c6154d6565b60405290565b604080519081016001600160401b038111828210171561550c5761550c6154d6565b604051601f8201601f191681016001600160401b038111828210171561555c5761555c6154d6565b604052919050565b5f6001600160401b0382111561557c5761557c6154d6565b50601f01601f191660200190565b5f82601f830112615599575f80fd5b81356155ac6155a782615564565b615534565b8181528460208386010111156155c0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155ec575f80fd5b6155f46154ea565b82356001600160401b038082111561560a575f80fd5b6156163683870161558a565b8352602085013591508082111561562b575f80fd5b506156383682860161558a565b60208301525061564a60408401615147565b604082015292915050565b5f82516154cc81846020870161524b565b601f8211156104d857805f5260205f20601f840160051c8101602085101561568b5750805b601f840160051c820191505b8181101561166b575f8155600101615697565b81516001600160401b038111156156c3576156c36154d6565b6156d7816156d184546153d5565b84615666565b602080601f83116001811461570a575f84156156f35750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561573857888601518255948401946001909101908401615719565b508582101561575557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c66615765565b5f63ffffffff8083168181036157a4576157a4615765565b6001019392505050565b5f826157c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157e1576157e1615223565b91905290565b8082028115828204841417610c6657610c66615765565b5f60208083525f8454615810816153d5565b806020870152604060018084165f8114615831576001811461584d5761587a565b60ff19851660408a0152604084151560051b8a0101955061587a565b895f5260205f205f5b858110156158715781548b8201860152908301908801615856565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611ea457611ea4615765565b6001600160401b03828116828216039080821115611ea457611ea4615765565b805161505781615037565b5f80604083850312156158f3575f80fd5b82516001600160401b0380821115615909575f80fd5b908401906060828703121561591c575f80fd5b6159246154ea565b8251815260208084015161593781615318565b8282015260408401518381111561594c575f80fd5b80850194505087601f850112615960575f80fd5b835192506159706155a784615564565b8381528882858701011115615983575f80fd5b6159928483830184880161524b565b806040840152508195506159a78188016158d7565b9450505050509250929050565b81810381811115610c6657610c66615765565b5f808335601e198436030181126159dc575f80fd5b8301803591506001600160401b038211156159f5575f80fd5b6020019150368190038213156136f5575f80fd5b5f8851615a1a818460208d0161524b565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615a9557615a95615765565b505092915050565b5f8235603e198336030181126154cc575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615aef575f80fd5b615af7615512565b615b0083615044565b81526020808401356001600160401b0380821115615b1c575f80fd5b9085019036601f830112615b2e575f80fd5b813581811115615b4057615b406154d6565b8060051b9150615b51848301615534565b8181529183018401918481019036841115615b6a575f80fd5b938501935b83851015615b945784359250615b8483615318565b8282529385019390850190615b6f565b94860194909452509295945050505050565b5f60208284031215615bb6575f80fd5b611d3f82615136565b5f60208284031215615bcf575f80fd5b813560ff81168114611d3f575f80fd5b5f6001600160401b038083168181036157a4576157a4615765565b5f60208284031215615c0a575f80fd5b8151611d3f81615037565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615c5b81602a850160208b0161524b565b865190830190615c7281602a840160208b0161524b565b60c087901b6001600160c01b031916602a9290910191820152615ca4603282018660e01b6001600160e01b0319169052565b615cbd603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ce081846020880161524b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615d1681846020890161524b565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615d5181846020880161524b565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615f70380380615f7083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e238061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004615041565b6104a8565b005b61020961021936600461507c565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004615041565b6106eb565b61020961025e366004615093565b6106f6565b6102096102713660046150e1565b610be2565b61028961028436600461507c565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb366004615041565b610c6c565b6102096102de366004615102565b610c77565b6102f66102f1366004615142565b610d39565b604051908152602001610234565b6102096103123660046151a7565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f66103423660046151cf565b610fd9565b61028961035536600461507c565b610ff2565b6102f65f81565b61020961036f366004615041565b611006565b610226603081565b61020961038a36600461507c565b611031565b61020961039d3660046151a7565b6110fc565b6102f66103b03660046151e8565b6112d4565b6102096103c3366004615102565b611300565b6102f65f80516020615d9783398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b61020961041036600461507c565b611489565b6102f65f80516020615db783398151915281565b61020961043736600461507c565b611672565b610226601481565b61045761045236600461507c565b6117af565b604051610234919061527d565b6102896202a30081565b6102f65f80516020615d7783398151915281565b610209610490366004615311565b6118fe565b6102f66104a336600461534f565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615df78339815191526020526040808220815160e0810190925280545f80516020615db783398151915293929190829060ff16600581111561052a5761052a615208565b600581111561053b5761053b615208565b815260200160018201805461054f906153ba565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906153ba565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063157610631615208565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016153f2565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d46565b6040518263ffffffff1660e01b81526004016106a59190615400565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e59190615412565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615db78339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af9190615412565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e96060850160408601615429565b6001600160a01b03161461082c576108076060840160408501615429565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a6060850185615444565b905090505f805b828163ffffffff161015610b22575f61085d6060880188615444565b8363ffffffff1681811061087357610873615489565b9050602002810190610885919061549d565b61088e906155c1565b80516040519192505f9160088801916108a69161563a565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf9190600401615400565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f9161563a565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d9190615412565b90508086600801835f0151604051610975919061563a565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f7615208565b021790555060208201516001820190610a10908261568f565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab591168561575e565b8251604051919550610ac69161563a565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b90615771565b9050610841565b50600483018190555f610b40610b3786611d95565b60400151611eab565b90505f610b4c87612038565b90505f600282604051610b5f919061563a565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190615412565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612212565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c615208565b14610c4c578060405163170cc93360e21b81526004016104cf91906153f2565b6106e5838361224d565b5f610c6664e8d4a5100083615793565b92915050565b6106e58383836124c7565b610c7f6126b3565b5f80516020615d978339815191525f80610c98846126ea565b91509150610ca582612212565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce0615208565b03610d05575f83815260078501602052604081208054919055610d038282612a28565b505b610d1b81610d168460400151610fd9565b612a9e565b505050505b610d3660015f80516020615dd783398151915255565b50565b5f610d426126b3565b610d4e85858585612ad4565b9050610d6660015f80516020615dd783398151915255565b949350505050565b5f8181525f80516020615d578339815191526020526040808220815160e0810190925280545f80516020615d9783398151915293929190829060ff166003811115610dbb57610dbb615208565b6003811115610dcc57610dcc615208565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e59615208565b14610e7a578251604051633b0d540d60e21b81526104cf91906004016157b2565b600481516005811115610e8f57610e8f615208565b03610ea557610e9d85612cad565b505050505050565b5f80610ebc610eb389611d95565b60400151612e94565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a510006157cc565b5f610ffc826117af565b6080015192915050565b6110118383836124c7565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615d978339815191525f611049836117af565b519050600481600581111561106057611060615208565b14611080578060405163170cc93360e21b81526004016104cf91906153f2565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a28565b6111046126b3565b5f8181525f80516020615d578339815191526020526040808220815160e0810190925280545f80516020615d9783398151915293929190829060ff16600381111561115157611151615208565b600381111561116257611162615208565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db615208565b146111fc578051604051633b0d540d60e21b81526104cf91906004016157b2565b600461120b82604001516117af565b51600581111561121d5761121d615208565b146112af575f61122c85611d95565b90505f8061123d8360400151612e94565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612cad565b50506112d060015f80516020615dd783398151915255565b5050565b5f6112dd6126b3565b6112e88333846130ea565b9050610c6660015f80516020615dd783398151915255565b5f80516020615db78339815191525f8061132561131c85611d95565b604001516133c2565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f82815260068401602052604090208054611365906153ba565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af615208565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016153f2565b5f82815260068401602052604081206113fa91614f90565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615d578339815191526020526040808220815160e0810190925280545f80516020615d9783398151915293929190829060ff1660038111156114d6576114d6615208565b60038111156114e7576114e7615208565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561156057611560615208565b14158015611581575060038151600381111561157e5761157e615208565b14155b156115a2578051604051633b0d540d60e21b81526104cf91906004016157b2565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d46565b6040518263ffffffff1660e01b815260040161162b9190615400565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b9190615412565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615db783398151915291906116b9906153ba565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff16600581111561170357611703615208565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016153f2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016157e3565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190615412565b6117b7614fc7565b5f8281525f80516020615df7833981519152602052604090819020815160e0810190925280545f80516020615db7833981519152929190829060ff16600581111561180457611804615208565b600581111561181557611815615208565b8152602001600182018054611829906153ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611855906153ba565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611990848461357e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615db7833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a20908690869061586d565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d578339815191526020526040808220815160e0810190925280545f80516020615d978339815191529284929091829060ff166003811115611a8657611a86615208565b6003811115611a9757611a97615208565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b24615208565b14611b45578251604051633b0d540d60e21b81526104cf91906004016157b2565b60208301516001600160a01b03163314611be8575f828152600485016020526040902054336001600160a01b0390911603611be2575f82815260048501602052604090205460a0820151611ba991600160b01b90046001600160401b03169061587c565b6001600160401b0316421015611bdd5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b611be8565b336110a1565b600281516005811115611bfd57611bfd615208565b03611cda578615611c1457611c12828761224d565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c4d918491611c48919061589c565b613598565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c8e846136ef565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d3f9350505050565b600481516005811115611cef57611cef615208565b03611d2357611cfd836136ef565b5f898152600686016020526040902055611d1688612cad565b6001945050505050611d3f565b805160405163170cc93360e21b81526104cf91906004016153f2565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e2091908101906158c7565b9150915080611e4257604051636b2f19e960e01b815260040160405180910390fd5b815115611e68578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611ea4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611ee057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f2f57611ef7816001615999565b611f029060086157cc565b61ffff16848281518110611f1857611f18615489565b016020015160f81c901b9190911790600101611ee3565b5061ffff811615611f595760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611fb457611f70816003615999565b611f7b9060086157cc565b63ffffffff1685611f8d83600261575e565b81518110611f9d57611f9d615489565b016020015160f81c901b9190911790600101611f5c565b5063ffffffff811615611fda57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561202f57611ff181601f615999565b611ffc9060086157cc565b8661200883600661575e565b8151811061201857612018615489565b016020015160f81c901b9190911790600101611fdd565b50949350505050565b60605f8083356020850135601461205487870160408901615429565b6120616060890189615444565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6120e76060850185615444565b9050811015611ea457816120fe6060860186615444565b8381811061210e5761210e615489565b9050602002810190612120919061549d565b61212a90806159ac565b90506121396060870187615444565b8481811061214957612149615489565b905060200281019061215b919061549d565b61216590806159ac565b6121726060890189615444565b8681811061218257612182615489565b9050602002810190612194919061549d565b6121a29060208101906159ac565b6121af60608b018b615444565b888181106121bf576121bf615489565b90506020028101906121d1919061549d565b6121e29060608101906040016151cf565b6040516020016121f897969594939291906159ee565b60408051601f1981840301815291905291506001016120da565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612298573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122bf91908101906158c7565b91509150806122e157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612324573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123489190615412565b82511461236e578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123aa576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f806123b9846040015161388d565b915091508187146123e05760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615d97833981519152906001600160401b03908116908316111561249d575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26124bc565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615d97833981519152816124e086613a7e565b90506124eb86612212565b6124fa57600192505050611d3f565b5f8681526004830160205260409020546001600160a01b0316331461251f57336110a1565b5f86815260048301602052604090205460a082015161254e91600160b01b90046001600160401b03169061587c565b6001600160401b03168160c001516001600160401b031610156125955760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125ad576125a6878661224d565b90506125cb565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b031690634f22429f906125f090610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612659573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267d9190615412565b905080846007015f8a81526020019081526020015f205f8282546126a1919061575e565b90915550501515979650505050505050565b5f80516020615dd78339815191528054600119016126e457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6126f3614fc7565b5f80516020615db78339815191525f8061270f61131c87611d95565b91509150801561273657604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561276757612767615208565b600581111561277857612778615208565b815260200160018201805461278c906153ba565b80601f01602080910402602001604051908101604052809291908181526020018280546127b8906153ba565b80156128035780601f106127da57610100808354040283529160200191612803565b820191905f5260205f20905b8154815290600101906020018083116127e657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561286e5761286e615208565b1415801561288f575060018151600581111561288c5761288c615208565b14155b156128b057805160405163170cc93360e21b81526104cf91906004016153f2565b6003815160058111156128c5576128c5615208565b036128d357600481526128d8565b600581525b8360080181602001516040516128ee919061563a565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561293257612932615208565b02179055506020820151600182019061294b908261568f565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129f1576129f1615208565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d7783398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a83575f80fd5b505af1158015612a95573d5f803e3d5ffd5b50505050505050565b5f80516020615d77833981519152546112d0906001600160a01b03168383613d62565b60015f80516020615dd783398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615d9783398151915290600160401b900461ffff9081169086161080612b28575061271061ffff8616115b15612b4c57604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b88576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612b9a5750806001015483115b15612bbb5760405163222d164360e21b8152600481018490526024016104cf565b5f612bc584613dc1565b90505f612bd182610c56565b90505f612bde8983613de4565b90506040518060800160405280612bf23390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615d578339815191526020526040808220815160e0810190925280545f80516020615d9783398151915293929190829060ff166003811115612cfa57612cfa615208565b6003811115612d0b57612d0b615208565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e39575f84815260048701602052604090205461271090612deb90600160a01b900461ffff16856157cc565b612df59190615793565b915081866007015f8681526020019081526020015f205f828254612e19919061575e565b90915550612e2990508284615999565b9050612e39856020015182612a28565b612e4e8560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ecb57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f1a57612ee2816001615999565b612eed9060086157cc565b61ffff16868281518110612f0357612f03615489565b016020015160f81c901b9190911790600101612ece565b5061ffff811615612f445760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612f9f57612f5b816003615999565b612f669060086157cc565b63ffffffff1687612f7883600261575e565b81518110612f8857612f88615489565b016020015160f81c901b9190911790600101612f47565b5063ffffffff8116600314612fc757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561301c57612fde81601f615999565b612fe99060086157cc565b88612ff583600661575e565b8151811061300557613005615489565b016020015160f81c901b9190911790600101612fca565b505f805b600881101561307b57613034816007615999565b61303f9060086157cc565b6001600160401b03168961305483602661575e565b8151811061306457613064615489565b016020015160f81c901b9190911790600101613020565b505f805b60088110156130da57613093816007615999565b61309e9060086157cc565b6001600160401b03168a6130b383602e61575e565b815181106130c3576130c3615489565b016020015160f81c901b919091179060010161307f565b5091989097509095509350505050565b5f5f80516020615d978339815191528161310661028485613dc1565b90505f613112876117af565b905061311d87612212565b61313d576040516330efa98b60e01b8152600481018890526024016104cf565b60028151600581111561315257613152615208565b1461317357805160405163170cc93360e21b81526104cf91906004016153f2565b5f828260800151613184919061587c565b905083600201600a9054906101000a90046001600160401b031682604001516131ad9190615a57565b6001600160401b0316816001600160401b031611156131ea57604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806131f68a84613598565b915091505f8a8360405160200161322492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132b7576132b7615208565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146133f857825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156134475761340f816001615999565b61341a9060086157cc565b61ffff1685828151811061343057613430615489565b016020015160f81c901b91909117906001016133fb565b5061ffff8116156134715760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134cc57613488816003615999565b6134939060086157cc565b63ffffffff16866134a583600261575e565b815181106134b5576134b5615489565b016020015160f81c901b9190911790600101613474565b5063ffffffff81166002146134f457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135495761350b81601f615999565b6135169060086157cc565b8761352283600661575e565b8151811061353257613532615489565b016020015160f81c901b91909117906001016134f7565b505f8660268151811061355e5761355e615489565b016020015191976001600160f81b03199092161515965090945050505050565b61358661435c565b61358f826143a7565b6112d081614415565b5f8281525f80516020615df7833981519152602052604081206002015481905f80516020615db783398151915290600160801b90046001600160401b03166135e0858261447d565b5f6135ea87614657565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61363a8a858b611d46565b6040518263ffffffff1660e01b81526004016136569190615400565b6020604051808303815f875af1158015613672573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136969190615412565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615d9783398151915290505f61370f84604001516117af565b90505f60038251600581111561372757613727615208565b1480613745575060048251600581111561374357613743615208565b145b15613755575060c0810151613792565b60028251600581111561376a5761376a615208565b03613776575042613792565b815160405163170cc93360e21b81526104cf91906004016153f2565b84608001516001600160401b0316816001600160401b0316116137b957505f949350505050565b600383015460608601516001600160a01b0390911690634f22429f906137de90610fd9565b60a085015160808901516040808b01515f90815260048a81016020529082902060010154915160e087901b6001600160e01b0319168152908101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613860573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138849190615412565b95945050505050565b5f808251602e146138c357825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b6002811015613912576138da816001615999565b6138e59060086157cc565b61ffff168582815181106138fb576138fb615489565b016020015160f81c901b91909117906001016138c6565b5061ffff81161561393c5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b600481101561399757613953816003615999565b61395e9060086157cc565b63ffffffff168661397083600261575e565b8151811061398057613980615489565b016020015160f81c901b919091179060010161393f565b5063ffffffff8116156139bd57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a12576139d481601f615999565b6139df9060086157cc565b876139eb83600661575e565b815181106139fb576139fb615489565b016020015160f81c901b91909117906001016139c0565b505f805b6008811015613a7157613a2a816007615999565b613a359060086157cc565b6001600160401b031688613a4a83602661575e565b81518110613a5a57613a5a615489565b016020015160f81c901b9190911790600101613a16565b5090969095509350505050565b613a86614fc7565b5f8281525f80516020615df78339815191526020526040808220815160e0810190925280545f80516020615db783398151915293929190829060ff166005811115613ad357613ad3615208565b6005811115613ae457613ae4615208565b8152602001600182018054613af8906153ba565b80601f0160208091040260200160405190810160405280929190818152602001828054613b24906153ba565b8015613b6f5780601f10613b4657610100808354040283529160200191613b6f565b820191905f5260205f20905b815481529060010190602001808311613b5257829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613bdd57613bdd615208565b14613c10575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016153f2565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c5457613c54615208565b021790555060208201516001820190613c6d908261568f565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d0b8582613598565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146cc565b5f610c66825f80516020615d77833981519152546001600160a01b03169061472d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e2857604051637fab81e560e01b815260040160405180910390fd5b5f80516020615db783398151915242613e4760608601604087016151cf565b6001600160401b0316111580613e815750613e656202a3004261575e565b613e7560608601604087016151cf565b6001600160401b031610155b15613ebb57613e9660608501604086016151cf565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613ed0613ecb6060860186615a82565b614886565b613ee0613ecb6080860186615a82565b6030613eef60208601866159ac565b905014613f2157613f0360208501856159ac565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f2b84806159ac565b90505f03613f5857613f3d84806159ac565b604051633e08a12560e11b81526004016104cf929190615a96565b5f60088201613f6786806159ac565b604051613f7592919061586d565b90815260200160405180910390205414613fae57613f9384806159ac565b60405163a41f772f60e01b81526004016104cf929190615a96565b613fb8835f61447d565b6040805160e08101909152815481525f9081906140c49060208101613fdd89806159ac565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614025908a018a6159ac565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161406e60608a0160408b016151cf565b6001600160401b0316815260200161408960608a018a615a82565b61409290615ac4565b81526020016140a460808a018a615a82565b6140ad90615ac4565b8152602001876001600160401b03168152506149ef565b5f828152600686016020526040902091935091506140e2828261568f565b5081600884016140f288806159ac565b60405161410092919061586d565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061413c908590600401615400565b6020604051808303815f875af1158015614158573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061417c9190615412565b6040805160e08101909152909150806001815260200161419c89806159ac565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561422b5761422b615208565b021790555060208201516001820190614244908261568f565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806142e288806159ac565b6040516142f092919061586d565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061432e91906151cf565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143a557604051631afcd79f60e31b815260040160405180910390fd5b565b6143af61435c565b6143b881614bdc565b6143c0614bf5565b610d36606082013560808301356143dd60c0850160a086016151cf565b6143ed60e0860160c08701615b8b565b6143fe610100870160e08801615ba4565b61441061012088016101008901615429565b614c05565b61441d61435c565b5f80516020615d778339815191526001600160a01b03821661445d57604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615db78339815191525f6001600160401b0380841690851611156144b1576144aa838561589c565b90506144be565b6144bb848461589c565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061452057506001840154815161451c916001600160401b03169061575e565b8210155b15614546576001600160401b038316606082015281815260408101516020820152614565565b8281606001818151614558919061587c565b6001600160401b03169052505b6060810151614575906064615a57565b602082015160018601546001600160401b0392909216916145a09190600160401b900460ff166157cc565b10156145d057606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516145eb919061575e565b9052506040810180516001600160401b038716919061460b908390615999565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615df78339815191526020526040812060020180545f80516020615db783398151915291906008906146a190600160401b90046001600160401b0316615bc4565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146e06001600160a01b03841683614d34565b905080515f141580156147045750808060200190518101906147029190615bdf565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147979190615412565b90506147ae6001600160a01b038516333086614d41565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156147f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148169190615412565b905081811161487c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b6138848282615999565b6148936020820182615102565b63ffffffff161580156148b357506148ae6020820182615444565b151590505b156148fa576148c56020820182615102565b6148d26020830183615444565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b6149076020820182615444565b90506149166020830183615102565b63ffffffff16111561492f576148c56020820182615102565b60015b61493f6020830183615444565b90508110156112d0576149556020830183615444565b614960600184615999565b81811061496f5761496f615489565b90506020020160208101906149849190615429565b6001600160a01b031661499a6020840184615444565b838181106149aa576149aa615489565b90506020020160208101906149bf9190615429565b6001600160a01b031610156149e757604051630dbc8d5f60e31b815260040160405180910390fd5b600101614932565b5f6060826040015151603014614a185760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a59988a986001989297929690959094909390929101615bfa565b60405160208183030381529060405290505f5b84608001516020015151811015614acb57818560800151602001518281518110614a9857614a98615489565b6020026020010151604051602001614ab1929190615cb4565b60408051601f198184030181529190529150600101614a6c565b5060a0840151805160209182015151604051614aeb938593929101615cea565b60405160208183030381529060405290505f5b8460a001516020015151811015614b5d57818560a00151602001518281518110614b2a57614b2a615489565b6020026020010151604051602001614b43929190615cb4565b60408051601f198184030181529190529150600101614afe565b5060c0840151604051614b74918391602001615d25565b6040516020818303038152906040529050600281604051614b95919061563a565b602060405180830381855afa158015614bb0573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bd39190615412565b94909350915050565b614be461435c565b614bec614d7a565b610d3681614d82565b614bfd61435c565b6143a5614e6a565b614c0d61435c565b5f80516020615d9783398151915261ffff84161580614c31575061271061ffff8516115b15614c5557604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c795760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614c8c5750600a60ff8416115b15614caf5760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d3f83835f614e72565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613d8f565b6143a561435c565b614d8a61435c565b80355f80516020615db78339815191529081556014614daf6060840160408501615ba4565b60ff161180614dce5750614dc96060830160408401615ba4565b60ff16155b15614e0257614de36060830160408401615ba4565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614e126060830160408401615ba4565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e4360408301602084016151cf565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ac161435c565b606081471015614e975760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614eb2919061563a565b5f6040518083038185875af1925050503d805f8114614eec576040519150601f19603f3d011682016040523d82523d5f602084013e614ef1565b606091505b5091509150614f01868383614f0b565b9695505050505050565b606082614f2057614f1b82614f67565b611d3f565b8151158015614f3757506001600160a01b0384163b155b15614f6057604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d3f565b805115614f775780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614f9c906153ba565b5f825580601f10614fab575050565b601f0160209004905f5260205f2090810190610d369190615004565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615018575f8155600101615005565b5090565b8015158114610d36575f80fd5b803563ffffffff8116811461503c575f80fd5b919050565b5f805f60608486031215615053575f80fd5b8335925060208401356150658161501c565b915061507360408501615029565b90509250925092565b5f6020828403121561508c575f80fd5b5035919050565b5f80604083850312156150a4575f80fd5b82356001600160401b038111156150b9575f80fd5b8301608081860312156150ca575f80fd5b91506150d860208401615029565b90509250929050565b5f80604083850312156150f2575f80fd5b823591506150d860208401615029565b5f60208284031215615112575f80fd5b611d3f82615029565b803561ffff8116811461503c575f80fd5b80356001600160401b038116811461503c575f80fd5b5f805f8060808587031215615155575f80fd5b84356001600160401b0381111561516a575f80fd5b850160a0818803121561517b575f80fd5b93506151896020860161511b565b92506151976040860161512c565b9396929550929360600135925050565b5f80604083850312156151b8575f80fd5b6151c183615029565b946020939093013593505050565b5f602082840312156151df575f80fd5b611d3f8261512c565b5f80604083850312156151f9575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061522c5761522c615208565b9052565b5f5b8381101561524a578181015183820152602001615232565b50505f910152565b5f8151808452615269816020860160208601615230565b601f01601f19169290920160200192915050565b6020815261528f60208201835161521c565b5f602083015160e060408401526152aa610100840182615252565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f80828403610140811215615324575f80fd5b61012080821215615333575f80fd5b8493508301359050615344816152fd565b809150509250929050565b5f8060208385031215615360575f80fd5b82356001600160401b0380821115615376575f80fd5b818501915085601f830112615389575f80fd5b813581811115615397575f80fd5b8660208285010111156153a8575f80fd5b60209290920196919550909350505050565b600181811c908216806153ce57607f821691505b6020821081036153ec57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c66828461521c565b602081525f611d3f6020830184615252565b5f60208284031215615422575f80fd5b5051919050565b5f60208284031215615439575f80fd5b8135611d3f816152fd565b5f808335601e19843603018112615459575f80fd5b8301803591506001600160401b03821115615472575f80fd5b6020019150600581901b36038213156136e8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154b1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154f1576154f16154bb565b60405290565b604080519081016001600160401b03811182821017156154f1576154f16154bb565b604051601f8201601f191681016001600160401b0381118282101715615541576155416154bb565b604052919050565b5f6001600160401b03821115615561576155616154bb565b50601f01601f191660200190565b5f82601f83011261557e575f80fd5b813561559161558c82615549565b615519565b8181528460208386010111156155a5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155d1575f80fd5b6155d96154cf565b82356001600160401b03808211156155ef575f80fd5b6155fb3683870161556f565b83526020850135915080821115615610575f80fd5b5061561d3682860161556f565b60208301525061562f6040840161512c565b604082015292915050565b5f82516154b1818460208701615230565b601f8211156104d857805f5260205f20601f840160051c810160208510156156705750805b601f840160051c820191505b8181101561166b575f815560010161567c565b81516001600160401b038111156156a8576156a86154bb565b6156bc816156b684546153ba565b8461564b565b602080601f8311600181146156ef575f84156156d85750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561571d578886015182559484019460019091019084016156fe565b508582101561573a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c6661574a565b5f63ffffffff8083168181036157895761578961574a565b6001019392505050565b5f826157ad57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157c6576157c6615208565b91905290565b8082028115828204841417610c6657610c6661574a565b5f60208083525f84546157f5816153ba565b806020870152604060018084165f811461581657600181146158325761585f565b60ff19851660408a0152604084151560051b8a0101955061585f565b895f5260205f205f5b858110156158565781548b820186015290830190880161583b565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611ea457611ea461574a565b6001600160401b03828116828216039080821115611ea457611ea461574a565b805161503c8161501c565b5f80604083850312156158d8575f80fd5b82516001600160401b03808211156158ee575f80fd5b9084019060608287031215615901575f80fd5b6159096154cf565b8251815260208084015161591c816152fd565b82820152604084015183811115615931575f80fd5b80850194505087601f850112615945575f80fd5b8351925061595561558c84615549565b8381528882858701011115615968575f80fd5b61597784838301848801615230565b8060408401525081955061598c8188016158bc565b9450505050509250929050565b81810381811115610c6657610c6661574a565b5f808335601e198436030181126159c1575f80fd5b8301803591506001600160401b038211156159da575f80fd5b6020019150368190038213156136e8575f80fd5b5f88516159ff818460208d01615230565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615a7a57615a7a61574a565b505092915050565b5f8235603e198336030181126154b1575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ad4575f80fd5b615adc6154f7565b615ae583615029565b81526020808401356001600160401b0380821115615b01575f80fd5b9085019036601f830112615b13575f80fd5b813581811115615b2557615b256154bb565b8060051b9150615b36848301615519565b8181529183018401918481019036841115615b4f575f80fd5b938501935b83851015615b795784359250615b69836152fd565b8282529385019390850190615b54565b94860194909452509295945050505050565b5f60208284031215615b9b575f80fd5b611d3f8261511b565b5f60208284031215615bb4575f80fd5b813560ff81168114611d3f575f80fd5b5f6001600160401b038083168181036157895761578961574a565b5f60208284031215615bef575f80fd5b8151611d3f8161501c565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615c4081602a850160208b01615230565b865190830190615c5781602a840160208b01615230565b60c087901b6001600160c01b031916602a9290910191820152615c89603282018660e01b6001600160e01b0319169052565b615ca2603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615cc5818460208801615230565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615cfb818460208901615230565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615d36818460208801615230565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go index d343cda87..bffaf0a66 100644 --- a/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -31,8 +31,8 @@ var ( // ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. var ExampleRewardCalculatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"uptimeSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", - Bin: "0x60a0604052348015600e575f80fd5b50604051610357380380610357833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102d36100845f395f8181609e015261013a01526102d35ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80635dcc93911461004e578063778c06b51461006c578063afba878a1461007f578063bb65b24214610099575b5f80fd5b6100596301e1338081565b6040519081526020015b60405180910390f35b61005961007a3660046101b6565b6100d9565b610087605081565b60405160ff9091168152602001610063565b6100c07f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610063565b5f60506100e68887610236565b6100f0919061025e565b67ffffffffffffffff1661010585606461025e565b67ffffffffffffffff16101561011c57505f61018f565b6127106301e1338061012e8888610236565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168b61016e919061028a565b610178919061028a565b61018291906102a7565b61018c91906102a7565b90505b979650505050505050565b803567ffffffffffffffff811681146101b1575f80fd5b919050565b5f805f805f805f60e0888a0312156101cc575f80fd5b873596506101dc6020890161019a565b95506101ea6040890161019a565b94506101f86060890161019a565b93506102066080890161019a565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561025757610257610222565b5092915050565b67ffffffffffffffff81811683821602808216919082811461028257610282610222565b505092915050565b80820281158282048414176102a1576102a1610222565b92915050565b5f826102c157634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"uptimeSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b50604051610343380380610343833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102bf6100845f395f8181609e015261013a01526102bf5ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80634f22429f1461004e5780635dcc939114610074578063afba878a1461007f578063bb65b24214610099575b5f80fd5b61006161005c3660046101b4565b6100d9565b6040519081526020015b60405180910390f35b6100616301e1338081565b610087605081565b60405160ff909116815260200161006b565b6100c07f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161006b565b5f60506100e68685610222565b6100f0919061024a565b67ffffffffffffffff1661010583606461024a565b67ffffffffffffffff16101561011c57505f61018f565b6127106301e1338061012e8686610222565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961016e9190610276565b6101789190610276565b6101829190610293565b61018c9190610293565b90505b95945050505050565b803567ffffffffffffffff811681146101af575f80fd5b919050565b5f805f805f60a086880312156101c8575f80fd5b853594506101d860208701610198565b93506101e660408701610198565b92506101f460608701610198565b915061020260808701610198565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156102435761024361020e565b5092915050565b67ffffffffffffffff81811683821602808216919082811461026e5761026e61020e565b505092915050565b808202811582820484141761028d5761028d61020e565b92915050565b5f826102ad57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -264,12 +264,12 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) UPTIMEREWA return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) } -// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// CalculateReward is a free data retrieval call binding the contract method 0x4f22429f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64) (*big.Int, error) { var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds) if err != nil { return *new(*big.Int), err @@ -281,18 +281,18 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(o } -// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// CalculateReward is a free data retrieval call binding the contract method 0x4f22429f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds) } -// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// CalculateReward is a free data retrieval call binding the contract method 0x4f22429f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds) } // RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 9bff585a9..89657a5c3 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -91,7 +91,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615c96380380615c9683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b498061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614e00565b61060a565b005b348015610216575f80fd5b50610209610225366004614e3b565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614e00565b61084d565b34801561027f575f80fd5b5061020961028e366004614e52565b610858565b34801561029e575f80fd5b506102096102ad366004614ea0565b610d44565b3480156102bd575f80fd5b506102096102cc366004614eb7565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614e3b565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614e00565b610eab565b34801561038c575f80fd5b5061020961039b366004614ed8565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614ef1565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614f2f565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614e3b565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614e00565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614e3b565b61123b565b3480156104a4575f80fd5b506102096104b3366004614ef1565b611306565b3480156104c3575f80fd5b506102096104d2366004614ed8565b6114de565b6104076104e5366004614f59565b611667565b3480156104f5575f80fd5b506104075f80516020615abd83398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614e3b565b61169b565b34801561054e575f80fd5b506104075f80516020615add83398151915281565b34801561056e575f80fd5b5061020961057d366004614e3b565b611884565b610407610590366004614e3b565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614e3b565b6119f2565b60405161024c9190615022565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b506104076106053660046150a2565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff16600581111561068c5761068c614fad565b600581111561069d5761069d614fad565b81526020016001820180546106b19061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061510d565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614fad565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611ea3565b6040518263ffffffff1660e01b8152600401610807919061514d565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610847919061515f565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615add8339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610911919061515f565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161518a565b6001600160a01b03161461098e57610969606084016040850161518a565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c60608501856151a5565b905090505f805b828163ffffffff161015610c84575f6109bf60608801886151a5565b8363ffffffff168181106109d5576109d56151ea565b90506020028101906109e791906151fe565b6109f090615322565b80516040519192505f916008880191610a089161539b565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b8152610631919060040161514d565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a819161539b565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf919061515f565b90508086600801835f0151604051610ad7919061539b565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614fad565b021790555060208201516001820190610b7290826153f0565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c179116856154bf565b8251604051919550610c289161539b565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d906154d2565b90506109a3565b50600483018190555f610ca2610c9986611ef2565b60400151612008565b90505f610cae87612195565b90505f600282604051610cc1919061539b565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff919061515f565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd58361236f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a82612380565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614fad565b14610e8b578060405163170cc93360e21b8152600401610631919061513f565b61084783836123bb565b5f610ea564e8d4a51000836154f4565b92915050565b610847838383612635565b610ebe61282e565b5f80516020615abd8339815191525f80610ed784612865565b91509150610ee482612380565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614fad565b03610f44575f83815260078501602052604081208054919055610f428282612ba3565b505b610f5a81610f5584604001516111e3565b612c01565b505050505b610f7560015f80516020615afd83398151915255565b50565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115610fc557610fc5614fad565b6003811115610fd657610fd6614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614fad565b14611084578251604051633b0d540d60e21b81526106319190600401615513565b60048151600581111561109957611099614fad565b036110af576110a785612c27565b505050505050565b5f806110c66110bd89611ef2565b60400151612e0e565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a5100061552d565b5f611206826119f2565b6080015192915050565b61121b838383612635565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615abd8339815191525f611253836119f2565b519050600481600581111561126a5761126a614fad565b1461128a578060405163170cc93360e21b8152600401610631919061513f565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612ba3565b61130e61282e565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff16600381111561135b5761135b614fad565b600381111561136c5761136c614fad565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614fad565b14611406578051604051633b0d540d60e21b81526106319190600401615513565b600461141582604001516119f2565b51600581111561142757611427614fad565b146114b9575f61143685611ef2565b90505f806114478360400151612e0e565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c27565b50506114da60015f80516020615afd83398151915255565b5050565b5f80516020615add8339815191525f806115036114fa85611ef2565b60400151613064565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f828152600684016020526040902080546115439061510d565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614fad565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068401602052604081206115d891614d54565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61167061282e565b61167c84848434613220565b905061169460015f80516020615afd83398151915255565b9392505050565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff1660038111156116e8576116e8614fad565b60038111156116f9576116f9614fad565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614fad565b14158015611793575060038151600381111561179057611790614fad565b14155b156117b4578051604051633b0d540d60e21b81526106319190600401615513565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611ea3565b6040518263ffffffff1660e01b815260040161183d919061514d565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d919061515f565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615add83398151915291906118cb9061510d565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614fad565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119819190600401615544565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a919061515f565b5f6119ca61282e565b6119d58233346133ee565b90506119ed60015f80516020615afd83398151915255565b919050565b6119fa614d8b565b5f8281525f80516020615b1d833981519152602052604090819020815160e0810190925280545f80516020615add833981519152929190829060ff166005811115611a4757611a47614fad565b6005811115611a5857611a58614fad565b8152602001600182018054611a6c9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a989061510d565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615add833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8490869086906155ce565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd8339815191529284929091829060ff166003811115611bea57611bea614fad565b6003811115611bfb57611bfb614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614fad565b14611ca9578251604051633b0d540d60e21b81526106319190600401615513565b60208301516001600160a01b03163314611d4c575f828152600485016020526040902054336001600160a01b0390911603611d46575f82815260048501602052604090205460a0820151611d0d91600160b01b90046001600160401b0316906155dd565b6001600160401b0316421015611d415760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b611d4c565b336112ab565b600281516005811115611d6157611d61614fad565b03611e3e578615611d7857611d7682876123bb565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611db1918491611dac91906155fd565b6136c3565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611df28461381a565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e5357611e53614fad565b03611e8757611e618361381a565b5f898152600686016020526040902055611e7a88612c27565b6001945050505050611694565b805160405163170cc93360e21b8152610631919060040161513f565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f56573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7d9190810190615628565b9150915080611f9f57604051636b2f19e960e01b815260040160405180910390fd5b815115611fc5578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612001576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461203d57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561208c576120548160016156fa565b61205f90600861552d565b61ffff16848281518110612075576120756151ea565b016020015160f81c901b9190911790600101612040565b5061ffff8116156120b65760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612111576120cd8160036156fa565b6120d890600861552d565b63ffffffff16856120ea8360026154bf565b815181106120fa576120fa6151ea565b016020015160f81c901b91909117906001016120b9565b5063ffffffff81161561213757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561218c5761214e81601f6156fa565b61215990600861552d565b866121658360066154bf565b81518110612175576121756151ea565b016020015160f81c901b919091179060010161213a565b50949350505050565b60605f808335602085013560146121b18787016040890161518a565b6121be60608901896151a5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61224460608501856151a5565b9050811015612001578161225b60608601866151a5565b8381811061226b5761226b6151ea565b905060200281019061227d91906151fe565b612287908061570d565b905061229660608701876151a5565b848181106122a6576122a66151ea565b90506020028101906122b891906151fe565b6122c2908061570d565b6122cf60608901896151a5565b868181106122df576122df6151ea565b90506020028101906122f191906151fe565b6122ff90602081019061570d565b61230c60608b018b6151a5565b8881811061231c5761231c6151ea565b905060200281019061232e91906151fe565b61233f906060810190604001614f2f565b604051602001612355979695949392919061574f565b60408051601f198184030181529190529150600101612237565b6123776139c6565b610f7581613a11565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612406573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261242d9190810190615628565b915091508061244f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b6919061515f565b8251146124dc578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612518576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125278460400151613a7f565b9150915081871461254e5760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615abd833981519152906001600160401b03908116908316111561260b575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261262a565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615abd8339815191528161264e86613c70565b905061265986612380565b61266857600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461268d57336112ab565b5f86815260048301602052604090205460a08201516126bc91600160b01b90046001600160401b0316906155dd565b6001600160401b03168160c001516001600160401b031610156127035760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f851561271b5761271487866123bb565b9050612739565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061275e906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156127d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f8919061515f565b905080846007015f8a81526020019081526020015f205f82825461281c91906154bf565b90915550501515979650505050505050565b5f80516020615afd83398151915280546001190161285f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61286e614d8b565b5f80516020615add8339815191525f8061288a6114fa87611ef2565b9150915080156128b157604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128e2576128e2614fad565b60058111156128f3576128f3614fad565b81526020016001820180546129079061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546129339061510d565b801561297e5780601f106129555761010080835404028352916020019161297e565b820191905f5260205f20905b81548152906001019060200180831161296157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129e9576129e9614fad565b14158015612a0a5750600181516005811115612a0757612a07614fad565b14155b15612a2b57805160405163170cc93360e21b8152610631919060040161513f565b600381516005811115612a4057612a40614fad565b03612a4e5760048152612a53565b600581525b836008018160200151604051612a69919061539b565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aad57612aad614fad565b021790555060208201516001820190612ac690826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b6c57612b6c614fad565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612bef575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f54565b60015f80516020615afd83398151915255565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115612c7457612c74614fad565b6003811115612c8557612c85614fad565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612db3575f84815260048701602052604090205461271090612d6590600160a01b900461ffff168561552d565b612d6f91906154f4565b915081866007015f8681526020019081526020015f205f828254612d9391906154bf565b90915550612da3905082846156fa565b9050612db3856020015182612ba3565b612dc88560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4557835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e9457612e5c8160016156fa565b612e6790600861552d565b61ffff16868281518110612e7d57612e7d6151ea565b016020015160f81c901b9190911790600101612e48565b5061ffff811615612ebe5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f1957612ed58160036156fa565b612ee090600861552d565b63ffffffff1687612ef28360026154bf565b81518110612f0257612f026151ea565b016020015160f81c901b9190911790600101612ec1565b5063ffffffff8116600314612f4157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f9657612f5881601f6156fa565b612f6390600861552d565b88612f6f8360066154bf565b81518110612f7f57612f7f6151ea565b016020015160f81c901b9190911790600101612f44565b505f805b6008811015612ff557612fae8160076156fa565b612fb990600861552d565b6001600160401b031689612fce8360266154bf565b81518110612fde57612fde6151ea565b016020015160f81c901b9190911790600101612f9a565b505f805b60088110156130545761300d8160076156fa565b61301890600861552d565b6001600160401b03168a61302d83602e6154bf565b8151811061303d5761303d6151ea565b016020015160f81c901b9190911790600101612ff9565b5091989097509095509350505050565b5f80825160271461309a57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b60028110156130e9576130b18160016156fa565b6130bc90600861552d565b61ffff168582815181106130d2576130d26151ea565b016020015160f81c901b919091179060010161309d565b5061ffff8116156131135760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561316e5761312a8160036156fa565b61313590600861552d565b63ffffffff16866131478360026154bf565b81518110613157576131576151ea565b016020015160f81c901b9190911790600101613116565b5063ffffffff811660021461319657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131eb576131ad81601f6156fa565b6131b890600861552d565b876131c48360066154bf565b815181106131d4576131d46151ea565b016020015160f81c901b9190911790600101613199565b505f86602681518110613200576132006151ea565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615abd83398151915290600160401b900461ffff9081169086161080613274575061271061ffff8616115b1561329857604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b0390811690851610156132d4576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806132e65750806001015483115b156133075760405163222d164360e21b815260048101849052602401610631565b825f61331282610e95565b90505f61331f8983613fe7565b905060405180608001604052806133333390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615abd8339815191528161340784610e95565b90505f613413876119f2565b905061341e87612380565b61343e576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561345357613453614fad565b1461347457805160405163170cc93360e21b8152610631919060040161513f565b5f82826080015161348591906155dd565b905083600201600a9054906101000a90046001600160401b031682604001516134ae91906157b8565b6001600160401b0316816001600160401b031611156134eb57604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806134f78a846136c3565b915091505f8a8360405160200161352592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135b8576135b8614fad565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615b1d833981519152602052604081206002015481905f80516020615add83398151915290600160801b90046001600160401b031661370b858261455f565b5f61371587614739565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137658a858b611ea3565b6040518263ffffffff1660e01b8152600401613781919061514d565b6020604051808303815f875af115801561379d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c1919061515f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615abd83398151915290505f61383a84604001516119f2565b90505f60038251600581111561385257613852614fad565b1480613870575060048251600581111561386e5761386e614fad565b145b15613880575060c08101516138bd565b60028251600581111561389557613895614fad565b036138a15750426138bd565b815160405163170cc93360e21b8152610631919060040161513f565b84608001516001600160401b0316816001600160401b0316116138e457505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613909906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139bd919061515f565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a0f57604051631afcd79f60e31b815260040160405180910390fd5b565b613a196139c6565b613a22816147ae565b613a2a6147c7565b610f7560608201356080830135613a4760c0850160a08601614f2f565b613a5760e0860160c087016157e3565b613a68610100870160e088016157fc565b613a7a6101208801610100890161518a565b6147d7565b5f808251602e14613ab557825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b0457613acc8160016156fa565b613ad790600861552d565b61ffff16858281518110613aed57613aed6151ea565b016020015160f81c901b9190911790600101613ab8565b5061ffff811615613b2e5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b8957613b458160036156fa565b613b5090600861552d565b63ffffffff1686613b628360026154bf565b81518110613b7257613b726151ea565b016020015160f81c901b9190911790600101613b31565b5063ffffffff811615613baf57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c0457613bc681601f6156fa565b613bd190600861552d565b87613bdd8360066154bf565b81518110613bed57613bed6151ea565b016020015160f81c901b9190911790600101613bb2565b505f805b6008811015613c6357613c1c8160076156fa565b613c2790600861552d565b6001600160401b031688613c3c8360266154bf565b81518110613c4c57613c4c6151ea565b016020015160f81c901b9190911790600101613c08565b5090969095509350505050565b613c78614d8b565b5f8281525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff166005811115613cc557613cc5614fad565b6005811115613cd657613cd6614fad565b8152602001600182018054613cea9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054613d169061510d565b8015613d615780601f10613d3857610100808354040283529160200191613d61565b820191905f5260205f20905b815481529060010190602001808311613d4457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dcf57613dcf614fad565b14613e02575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e4657613e46614fad565b021790555060208201516001820190613e5f90826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613efd85826136c3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f775760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fc0576040519150601f19603f3d011682016040523d82523d5f602084013e613fc5565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661402b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615add8339815191524261404a6060860160408701614f2f565b6001600160401b031611158061408457506140686202a300426154bf565b6140786060860160408701614f2f565b6001600160401b031610155b156140be576140996060850160408601614f2f565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b6140d36140ce606086018661581c565b614906565b6140e36140ce608086018661581c565b60306140f2602086018661570d565b90501461412457614106602085018561570d565b6040516326475b2f60e11b8152610631925060040190815260200190565b61412e848061570d565b90505f0361415b57614140848061570d565b604051633e08a12560e11b8152600401610631929190615830565b5f6008820161416a868061570d565b6040516141789291906155ce565b908152602001604051809103902054146141b157614196848061570d565b60405163a41f772f60e01b8152600401610631929190615830565b6141bb835f61455f565b6040805160e08101909152815481525f9081906142c790602081016141e0898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614228908a018a61570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161427160608a0160408b01614f2f565b6001600160401b0316815260200161428c60608a018a61581c565b6142959061585e565b81526020016142a760808a018a61581c565b6142b09061585e565b8152602001876001600160401b0316815250614a6f565b5f828152600686016020526040902091935091506142e582826153f0565b5081600884016142f5888061570d565b6040516143039291906155ce565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061433f90859060040161514d565b6020604051808303815f875af115801561435b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437f919061515f565b6040805160e08101909152909150806001815260200161439f898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561442e5761442e614fad565b02179055506020820151600182019061444790826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144e5888061570d565b6040516144f39291906155ce565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145319190614f2f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615add8339815191525f6001600160401b0380841690851611156145935761458c83856155fd565b90506145a0565b61459d84846155fd565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146025750600184015481516145fe916001600160401b0316906154bf565b8210155b15614628576001600160401b038316606082015281815260408101516020820152614647565b828160600181815161463a91906155dd565b6001600160401b03169052505b60608101516146579060646157b8565b602082015160018601546001600160401b0392909216916146829190600160401b900460ff1661552d565b10156146b257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146cd91906154bf565b9052506040810180516001600160401b03871691906146ed9083906156fa565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615b1d8339815191526020526040812060020180545f80516020615add833981519152919060089061478390600160401b90046001600160401b0316615925565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147b66139c6565b6147be614c5c565b610f7581614c64565b6147cf6139c6565b613a0f614d4c565b6147df6139c6565b5f80516020615abd83398151915261ffff84161580614803575061271061ffff8516115b1561482757604051635f12e6c360e11b815261ffff85166004820152602401610631565b8587111561484b5760405163222d164360e21b815260048101889052602401610631565b60ff8316158061485e5750600a60ff8416115b156148815760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6149136020820182614ed8565b63ffffffff16158015614933575061492e60208201826151a5565b151590505b1561497a576149456020820182614ed8565b61495260208301836151a5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b61498760208201826151a5565b90506149966020830183614ed8565b63ffffffff1611156149af576149456020820182614ed8565b60015b6149bf60208301836151a5565b90508110156114da576149d560208301836151a5565b6149e06001846156fa565b8181106149ef576149ef6151ea565b9050602002016020810190614a04919061518a565b6001600160a01b0316614a1a60208401846151a5565b83818110614a2a57614a2a6151ea565b9050602002016020810190614a3f919061518a565b6001600160a01b03161015614a6757604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149b2565b5f6060826040015151603014614a985760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614ad9988a986001989297929690959094909390929101615940565b60405160208183030381529060405290505f5b84608001516020015151811015614b4b57818560800151602001518281518110614b1857614b186151ea565b6020026020010151604051602001614b319291906159fa565b60408051601f198184030181529190529150600101614aec565b5060a0840151805160209182015151604051614b6b938593929101615a30565b60405160208183030381529060405290505f5b8460a001516020015151811015614bdd57818560a00151602001518281518110614baa57614baa6151ea565b6020026020010151604051602001614bc39291906159fa565b60408051601f198184030181529190529150600101614b7e565b5060c0840151604051614bf4918391602001615a6b565b6040516020818303038152906040529050600281604051614c15919061539b565b602060405180830381855afa158015614c30573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c53919061515f565b94909350915050565b613a0f6139c6565b614c6c6139c6565b80355f80516020615add8339815191529081556014614c9160608401604085016157fc565b60ff161180614cb05750614cab60608301604084016157fc565b60ff16155b15614ce457614cc560608301604084016157fc565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614cf460608301604084016157fc565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d256040830160208401614f2f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c146139c6565b508054614d609061510d565b5f825580601f10614d6f575050565b601f0160209004905f5260205f2090810190610f759190614dc8565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ddc575f8155600101614dc9565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614e12575f80fd5b833592506020840135614e2481614de0565b9150614e3260408501614ded565b90509250925092565b5f60208284031215614e4b575f80fd5b5035919050565b5f8060408385031215614e63575f80fd5b82356001600160401b03811115614e78575f80fd5b830160808186031215614e89575f80fd5b9150614e9760208401614ded565b90509250929050565b5f6101208284031215614eb1575f80fd5b50919050565b5f8060408385031215614ec8575f80fd5b82359150614e9760208401614ded565b5f60208284031215614ee8575f80fd5b61169482614ded565b5f8060408385031215614f02575f80fd5b614f0b83614ded565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614f3f575f80fd5b61169482614f19565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614f6b575f80fd5b83356001600160401b03811115614f80575f80fd5b840160a08187031215614f91575f80fd5b9250614f9f60208501614f48565b9150614e3260408501614f19565b634e487b7160e01b5f52602160045260245ffd5b60068110614fd157614fd1614fad565b9052565b5f5b83811015614fef578181015183820152602001614fd7565b50505f910152565b5f815180845261500e816020860160208601614fd5565b601f01601f19169290920160200192915050565b60208152615034602082018351614fc1565b5f602083015160e0604084015261504f610100840182614ff7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150b3575f80fd5b82356001600160401b03808211156150c9575f80fd5b818501915085601f8301126150dc575f80fd5b8135818111156150ea575f80fd5b8660208285010111156150fb575f80fd5b60209290920196919550909350505050565b600181811c9082168061512157607f821691505b602082108103614eb157634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614fc1565b602081525f6116946020830184614ff7565b5f6020828403121561516f575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561519a575f80fd5b813561169481615176565b5f808335601e198436030181126151ba575f80fd5b8301803591506001600160401b038211156151d3575f80fd5b6020019150600581901b3603821315613813575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615212575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152525761525261521c565b60405290565b604080519081016001600160401b03811182821017156152525761525261521c565b604051601f8201601f191681016001600160401b03811182821017156152a2576152a261521c565b604052919050565b5f6001600160401b038211156152c2576152c261521c565b50601f01601f191660200190565b5f82601f8301126152df575f80fd5b81356152f26152ed826152aa565b61527a565b818152846020838601011115615306575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615332575f80fd5b61533a615230565b82356001600160401b0380821115615350575f80fd5b61535c368387016152d0565b83526020850135915080821115615371575f80fd5b5061537e368286016152d0565b60208301525061539060408401614f19565b604082015292915050565b5f8251615212818460208701614fd5565b601f82111561063a57805f5260205f20601f840160051c810160208510156153d15750805b601f840160051c820191505b8181101561187d575f81556001016153dd565b81516001600160401b038111156154095761540961521c565b61541d81615417845461510d565b846153ac565b602080601f831160018114615450575f84156154395750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561547e5788860151825594840194600190910190840161545f565b508582101561549b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea56154ab565b5f63ffffffff8083168181036154ea576154ea6154ab565b6001019392505050565b5f8261550e57634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061552757615527614fad565b91905290565b8082028115828204841417610ea557610ea56154ab565b5f60208083525f84546155568161510d565b806020870152604060018084165f81146155775760018114615593576155c0565b60ff19851660408a0152604084151560051b8a010195506155c0565b895f5260205f205f5b858110156155b75781548b820186015290830190880161559c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115612001576120016154ab565b6001600160401b03828116828216039080821115612001576120016154ab565b80516119ed81614de0565b5f8060408385031215615639575f80fd5b82516001600160401b038082111561564f575f80fd5b9084019060608287031215615662575f80fd5b61566a615230565b8251815260208084015161567d81615176565b82820152604084015183811115615692575f80fd5b80850194505087601f8501126156a6575f80fd5b835192506156b66152ed846152aa565b83815288828587010111156156c9575f80fd5b6156d884838301848801614fd5565b806040840152508195506156ed81880161561d565b9450505050509250929050565b81810381811115610ea557610ea56154ab565b5f808335601e19843603018112615722575f80fd5b8301803591506001600160401b0382111561573b575f80fd5b602001915036819003821315613813575f80fd5b5f8851615760818460208d01614fd5565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146157db576157db6154ab565b505092915050565b5f602082840312156157f3575f80fd5b61169482614f48565b5f6020828403121561580c575f80fd5b813560ff81168114611694575f80fd5b5f8235603e19833603018112615212575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6040823603121561586e575f80fd5b615876615258565b61587f83614ded565b81526020808401356001600160401b038082111561589b575f80fd5b9085019036601f8301126158ad575f80fd5b8135818111156158bf576158bf61521c565b8060051b91506158d084830161527a565b81815291830184019184810190368411156158e9575f80fd5b938501935b83851015615913578435925061590383615176565b82825293850193908501906158ee565b94860194909452509295945050505050565b5f6001600160401b038083168181036154ea576154ea6154ab565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161598681602a850160208b01614fd5565b86519083019061599d81602a840160208b01614fd5565b60c087901b6001600160c01b031916602a92909101918201526159cf603282018660e01b6001600160e01b0319169052565b6159e8603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a0b818460208801614fd5565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615a41818460208901614fd5565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615a7c818460208801614fd5565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615c7b380380615c7b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b2e8061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614de5565b61060a565b005b348015610216575f80fd5b50610209610225366004614e20565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614de5565b61084d565b34801561027f575f80fd5b5061020961028e366004614e37565b610858565b34801561029e575f80fd5b506102096102ad366004614e85565b610d44565b3480156102bd575f80fd5b506102096102cc366004614e9c565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614e20565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614de5565b610eab565b34801561038c575f80fd5b5061020961039b366004614ebd565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614ed6565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614f14565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614e20565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614de5565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614e20565b61123b565b3480156104a4575f80fd5b506102096104b3366004614ed6565b611306565b3480156104c3575f80fd5b506102096104d2366004614ebd565b6114de565b6104076104e5366004614f3e565b611667565b3480156104f5575f80fd5b506104075f80516020615aa283398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614e20565b61169b565b34801561054e575f80fd5b506104075f80516020615ac283398151915281565b34801561056e575f80fd5b5061020961057d366004614e20565b611884565b610407610590366004614e20565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614e20565b6119f2565b60405161024c9190615007565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004615087565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615b028339815191526020526040808220815160e0810190925280545f80516020615ac283398151915293929190829060ff16600581111561068c5761068c614f92565b600581111561069d5761069d614f92565b81526020016001820180546106b1906150f2565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd906150f2565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614f92565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401615124565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611ea3565b6040518263ffffffff1660e01b81526004016108079190615132565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108479190615144565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615ac28339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109119190615144565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161516f565b6001600160a01b03161461098e57610969606084016040850161516f565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c606085018561518a565b905090505f805b828163ffffffff161015610c84575f6109bf606088018861518a565b8363ffffffff168181106109d5576109d56151cf565b90506020028101906109e791906151e3565b6109f090615307565b80516040519192505f916008880191610a0891615380565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b81526106319190600401615132565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8191615380565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf9190615144565b90508086600801835f0151604051610ad79190615380565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614f92565b021790555060208201516001820190610b7290826153d5565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c179116856154a4565b8251604051919550610c2891615380565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d906154b7565b90506109a3565b50600483018190555f610ca2610c9986611ef2565b60400151612008565b90505f610cae87612195565b90505f600282604051610cc19190615380565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff9190615144565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd58361236f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a82612380565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614f92565b14610e8b578060405163170cc93360e21b81526004016106319190615124565b61084783836123bb565b5f610ea564e8d4a51000836154d9565b92915050565b610847838383612635565b610ebe612821565b5f80516020615aa28339815191525f80610ed784612858565b91509150610ee482612380565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614f92565b03610f44575f83815260078501602052604081208054919055610f428282612b96565b505b610f5a81610f5584604001516111e3565b612bf4565b505050505b610f7560015f80516020615ae283398151915255565b50565b5f8181525f80516020615a828339815191526020526040808220815160e0810190925280545f80516020615aa283398151915293929190829060ff166003811115610fc557610fc5614f92565b6003811115610fd657610fd6614f92565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614f92565b14611084578251604051633b0d540d60e21b815261063191906004016154f8565b60048151600581111561109957611099614f92565b036110af576110a785612c1a565b505050505050565b5f806110c66110bd89611ef2565b60400151612e01565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a51000615512565b5f611206826119f2565b6080015192915050565b61121b838383612635565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615aa28339815191525f611253836119f2565b519050600481600581111561126a5761126a614f92565b1461128a578060405163170cc93360e21b81526004016106319190615124565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612b96565b61130e612821565b5f8181525f80516020615a828339815191526020526040808220815160e0810190925280545f80516020615aa283398151915293929190829060ff16600381111561135b5761135b614f92565b600381111561136c5761136c614f92565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614f92565b14611406578051604051633b0d540d60e21b815261063191906004016154f8565b600461141582604001516119f2565b51600581111561142757611427614f92565b146114b9575f61143685611ef2565b90505f806114478360400151612e01565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c1a565b50506114da60015f80516020615ae283398151915255565b5050565b5f80516020615ac28339815191525f806115036114fa85611ef2565b60400151613057565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f82815260068401602052604090208054611543906150f2565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614f92565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff1690600401615124565b5f82815260068401602052604081206115d891614d39565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611670612821565b61167c84848434613213565b905061169460015f80516020615ae283398151915255565b9392505050565b5f8181525f80516020615a828339815191526020526040808220815160e0810190925280545f80516020615aa283398151915293929190829060ff1660038111156116e8576116e8614f92565b60038111156116f9576116f9614f92565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614f92565b14158015611793575060038151600381111561179057611790614f92565b14155b156117b4578051604051633b0d540d60e21b815261063191906004016154f8565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611ea3565b6040518263ffffffff1660e01b815260040161183d9190615132565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d9190615144565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615ac283398151915291906118cb906150f2565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614f92565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff1690600401615124565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119819190600401615529565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190615144565b5f6119ca612821565b6119d58233346133e1565b90506119ed60015f80516020615ae283398151915255565b919050565b6119fa614d70565b5f8281525f80516020615b02833981519152602052604090819020815160e0810190925280545f80516020615ac2833981519152929190829060ff166005811115611a4757611a47614f92565b6005811115611a5857611a58614f92565b8152602001600182018054611a6c906150f2565b80601f0160208091040260200160405190810160405280929190818152602001828054611a98906150f2565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615ac2833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8490869086906155b3565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a828339815191526020526040808220815160e0810190925280545f80516020615aa28339815191529284929091829060ff166003811115611bea57611bea614f92565b6003811115611bfb57611bfb614f92565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614f92565b14611ca9578251604051633b0d540d60e21b815261063191906004016154f8565b60208301516001600160a01b03163314611d4c575f828152600485016020526040902054336001600160a01b0390911603611d46575f82815260048501602052604090205460a0820151611d0d91600160b01b90046001600160401b0316906155c2565b6001600160401b0316421015611d415760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b611d4c565b336112ab565b600281516005811115611d6157611d61614f92565b03611e3e578615611d7857611d7682876123bb565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611db1918491611dac91906155e2565b6136b6565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611df28461380d565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e5357611e53614f92565b03611e8757611e618361380d565b5f898152600686016020526040902055611e7a88612c1a565b6001945050505050611694565b805160405163170cc93360e21b81526106319190600401615124565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f56573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7d919081019061560d565b9150915080611f9f57604051636b2f19e960e01b815260040160405180910390fd5b815115611fc5578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612001576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461203d57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561208c576120548160016156df565b61205f906008615512565b61ffff16848281518110612075576120756151cf565b016020015160f81c901b9190911790600101612040565b5061ffff8116156120b65760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612111576120cd8160036156df565b6120d8906008615512565b63ffffffff16856120ea8360026154a4565b815181106120fa576120fa6151cf565b016020015160f81c901b91909117906001016120b9565b5063ffffffff81161561213757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561218c5761214e81601f6156df565b612159906008615512565b866121658360066154a4565b81518110612175576121756151cf565b016020015160f81c901b919091179060010161213a565b50949350505050565b60605f808335602085013560146121b18787016040890161516f565b6121be606089018961518a565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b612244606085018561518a565b9050811015612001578161225b606086018661518a565b8381811061226b5761226b6151cf565b905060200281019061227d91906151e3565b61228790806156f2565b9050612296606087018761518a565b848181106122a6576122a66151cf565b90506020028101906122b891906151e3565b6122c290806156f2565b6122cf606089018961518a565b868181106122df576122df6151cf565b90506020028101906122f191906151e3565b6122ff9060208101906156f2565b61230c60608b018b61518a565b8881811061231c5761231c6151cf565b905060200281019061232e91906151e3565b61233f906060810190604001614f14565b6040516020016123559796959493929190615734565b60408051601f198184030181529190529150600101612237565b6123776139ab565b610f75816139f6565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612406573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261242d919081019061560d565b915091508061244f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b69190615144565b8251146124dc578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612518576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125278460400151613a64565b9150915081871461254e5760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615aa2833981519152906001600160401b03908116908316111561260b575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261262a565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615aa28339815191528161264e86613c55565b905061265986612380565b61266857600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461268d57336112ab565b5f86815260048301602052604090205460a08201516126bc91600160b01b90046001600160401b0316906155c2565b6001600160401b03168160c001516001600160401b031610156127035760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f851561271b5761271487866123bb565b9050612739565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b031690634f22429f9061275e906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156127c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127eb9190615144565b905080846007015f8a81526020019081526020015f205f82825461280f91906154a4565b90915550501515979650505050505050565b5f80516020615ae283398151915280546001190161285257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612861614d70565b5f80516020615ac28339815191525f8061287d6114fa87611ef2565b9150915080156128a457604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128d5576128d5614f92565b60058111156128e6576128e6614f92565b81526020016001820180546128fa906150f2565b80601f0160208091040260200160405190810160405280929190818152602001828054612926906150f2565b80156129715780601f1061294857610100808354040283529160200191612971565b820191905f5260205f20905b81548152906001019060200180831161295457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129dc576129dc614f92565b141580156129fd57506001815160058111156129fa576129fa614f92565b14155b15612a1e57805160405163170cc93360e21b81526106319190600401615124565b600381516005811115612a3357612a33614f92565b03612a415760048152612a46565b600581525b836008018160200151604051612a5c9190615380565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aa057612aa0614f92565b021790555060208201516001820190612ab990826153d5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b5f57612b5f614f92565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612be2575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f39565b60015f80516020615ae283398151915255565b5f8181525f80516020615a828339815191526020526040808220815160e0810190925280545f80516020615aa283398151915293929190829060ff166003811115612c6757612c67614f92565b6003811115612c7857612c78614f92565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612da6575f84815260048701602052604090205461271090612d5890600160a01b900461ffff1685615512565b612d6291906154d9565b915081866007015f8681526020019081526020015f205f828254612d8691906154a4565b90915550612d96905082846156df565b9050612da6856020015182612b96565b612dbb8560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e3857835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e8757612e4f8160016156df565b612e5a906008615512565b61ffff16868281518110612e7057612e706151cf565b016020015160f81c901b9190911790600101612e3b565b5061ffff811615612eb15760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f0c57612ec88160036156df565b612ed3906008615512565b63ffffffff1687612ee58360026154a4565b81518110612ef557612ef56151cf565b016020015160f81c901b9190911790600101612eb4565b5063ffffffff8116600314612f3457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f8957612f4b81601f6156df565b612f56906008615512565b88612f628360066154a4565b81518110612f7257612f726151cf565b016020015160f81c901b9190911790600101612f37565b505f805b6008811015612fe857612fa18160076156df565b612fac906008615512565b6001600160401b031689612fc18360266154a4565b81518110612fd157612fd16151cf565b016020015160f81c901b9190911790600101612f8d565b505f805b6008811015613047576130008160076156df565b61300b906008615512565b6001600160401b03168a61302083602e6154a4565b81518110613030576130306151cf565b016020015160f81c901b9190911790600101612fec565b5091989097509095509350505050565b5f80825160271461308d57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b60028110156130dc576130a48160016156df565b6130af906008615512565b61ffff168582815181106130c5576130c56151cf565b016020015160f81c901b9190911790600101613090565b5061ffff8116156131065760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156131615761311d8160036156df565b613128906008615512565b63ffffffff168661313a8360026154a4565b8151811061314a5761314a6151cf565b016020015160f81c901b9190911790600101613109565b5063ffffffff811660021461318957604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131de576131a081601f6156df565b6131ab906008615512565b876131b78360066154a4565b815181106131c7576131c76151cf565b016020015160f81c901b919091179060010161318c565b505f866026815181106131f3576131f36151cf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615aa283398151915290600160401b900461ffff9081169086161080613267575061271061ffff8616115b1561328b57604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b0390811690851610156132c7576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806132d95750806001015483115b156132fa5760405163222d164360e21b815260048101849052602401610631565b825f61330582610e95565b90505f6133128983613fcc565b905060405180608001604052806133263390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615aa2833981519152816133fa84610e95565b90505f613406876119f2565b905061341187612380565b613431576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561344657613446614f92565b1461346757805160405163170cc93360e21b81526106319190600401615124565b5f82826080015161347891906155c2565b905083600201600a9054906101000a90046001600160401b031682604001516134a1919061579d565b6001600160401b0316816001600160401b031611156134de57604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806134ea8a846136b6565b915091505f8a8360405160200161351892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135ab576135ab614f92565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615b02833981519152602052604081206002015481905f80516020615ac283398151915290600160801b90046001600160401b03166136fe8582614544565b5f6137088761471e565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137588a858b611ea3565b6040518263ffffffff1660e01b81526004016137749190615132565b6020604051808303815f875af1158015613790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137b49190615144565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615aa283398151915290505f61382d84604001516119f2565b90505f60038251600581111561384557613845614f92565b1480613863575060048251600581111561386157613861614f92565b145b15613873575060c08101516138b0565b60028251600581111561388857613888614f92565b036138945750426138b0565b815160405163170cc93360e21b81526106319190600401615124565b84608001516001600160401b0316816001600160401b0316116138d757505f949350505050565b600383015460608601516001600160a01b0390911690634f22429f906138fc906111e3565b60a085015160808901516040808b01515f90815260048a81016020529082902060010154915160e087901b6001600160e01b0319168152908101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa15801561397e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139a29190615144565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166139f457604051631afcd79f60e31b815260040160405180910390fd5b565b6139fe6139ab565b613a0781614793565b613a0f6147ac565b610f7560608201356080830135613a2c60c0850160a08601614f14565b613a3c60e0860160c087016157c8565b613a4d610100870160e088016157e1565b613a5f6101208801610100890161516f565b6147bc565b5f808251602e14613a9a57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613ae957613ab18160016156df565b613abc906008615512565b61ffff16858281518110613ad257613ad26151cf565b016020015160f81c901b9190911790600101613a9d565b5061ffff811615613b135760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b6e57613b2a8160036156df565b613b35906008615512565b63ffffffff1686613b478360026154a4565b81518110613b5757613b576151cf565b016020015160f81c901b9190911790600101613b16565b5063ffffffff811615613b9457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613be957613bab81601f6156df565b613bb6906008615512565b87613bc28360066154a4565b81518110613bd257613bd26151cf565b016020015160f81c901b9190911790600101613b97565b505f805b6008811015613c4857613c018160076156df565b613c0c906008615512565b6001600160401b031688613c218360266154a4565b81518110613c3157613c316151cf565b016020015160f81c901b9190911790600101613bed565b5090969095509350505050565b613c5d614d70565b5f8281525f80516020615b028339815191526020526040808220815160e0810190925280545f80516020615ac283398151915293929190829060ff166005811115613caa57613caa614f92565b6005811115613cbb57613cbb614f92565b8152602001600182018054613ccf906150f2565b80601f0160208091040260200160405190810160405280929190818152602001828054613cfb906150f2565b8015613d465780601f10613d1d57610100808354040283529160200191613d46565b820191905f5260205f20905b815481529060010190602001808311613d2957829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613db457613db4614f92565b14613de7575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401615124565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e2b57613e2b614f92565b021790555060208201516001820190613e4490826153d5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ee285826136b6565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f5c5760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fa5576040519150601f19603f3d011682016040523d82523d5f602084013e613faa565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661401057604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ac28339815191524261402f6060860160408701614f14565b6001600160401b0316111580614069575061404d6202a300426154a4565b61405d6060860160408701614f14565b6001600160401b031610155b156140a35761407e6060850160408601614f14565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b6140b86140b36060860186615801565b6148eb565b6140c86140b36080860186615801565b60306140d760208601866156f2565b905014614109576140eb60208501856156f2565b6040516326475b2f60e11b8152610631925060040190815260200190565b61411384806156f2565b90505f036141405761412584806156f2565b604051633e08a12560e11b8152600401610631929190615815565b5f6008820161414f86806156f2565b60405161415d9291906155b3565b908152602001604051809103902054146141965761417b84806156f2565b60405163a41f772f60e01b8152600401610631929190615815565b6141a0835f614544565b6040805160e08101909152815481525f9081906142ac90602081016141c589806156f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061420d908a018a6156f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161425660608a0160408b01614f14565b6001600160401b0316815260200161427160608a018a615801565b61427a90615843565b815260200161428c60808a018a615801565b61429590615843565b8152602001876001600160401b0316815250614a54565b5f828152600686016020526040902091935091506142ca82826153d5565b5081600884016142da88806156f2565b6040516142e89291906155b3565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614324908590600401615132565b6020604051808303815f875af1158015614340573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143649190615144565b6040805160e08101909152909150806001815260200161438489806156f2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561441357614413614f92565b02179055506020820151600182019061442c90826153d5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144ca88806156f2565b6040516144d89291906155b3565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145169190614f14565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615ac28339815191525f6001600160401b0380841690851611156145785761457183856155e2565b9050614585565b61458284846155e2565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145e75750600184015481516145e3916001600160401b0316906154a4565b8210155b1561460d576001600160401b03831660608201528181526040810151602082015261462c565b828160600181815161461f91906155c2565b6001600160401b03169052505b606081015161463c90606461579d565b602082015160018601546001600160401b0392909216916146679190600160401b900460ff16615512565b101561469757606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146b291906154a4565b9052506040810180516001600160401b03871691906146d29083906156df565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615b028339815191526020526040812060020180545f80516020615ac2833981519152919060089061476890600160401b90046001600160401b031661590a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61479b6139ab565b6147a3614c41565b610f7581614c49565b6147b46139ab565b6139f4614d31565b6147c46139ab565b5f80516020615aa283398151915261ffff841615806147e8575061271061ffff8516115b1561480c57604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156148305760405163222d164360e21b815260048101889052602401610631565b60ff831615806148435750600a60ff8416115b156148665760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6148f86020820182614ebd565b63ffffffff161580156149185750614913602082018261518a565b151590505b1561495f5761492a6020820182614ebd565b614937602083018361518a565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b61496c602082018261518a565b905061497b6020830183614ebd565b63ffffffff1611156149945761492a6020820182614ebd565b60015b6149a4602083018361518a565b90508110156114da576149ba602083018361518a565b6149c56001846156df565b8181106149d4576149d46151cf565b90506020020160208101906149e9919061516f565b6001600160a01b03166149ff602084018461518a565b83818110614a0f57614a0f6151cf565b9050602002016020810190614a24919061516f565b6001600160a01b03161015614a4c57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614997565b5f6060826040015151603014614a7d5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614abe988a986001989297929690959094909390929101615925565b60405160208183030381529060405290505f5b84608001516020015151811015614b3057818560800151602001518281518110614afd57614afd6151cf565b6020026020010151604051602001614b169291906159df565b60408051601f198184030181529190529150600101614ad1565b5060a0840151805160209182015151604051614b50938593929101615a15565b60405160208183030381529060405290505f5b8460a001516020015151811015614bc257818560a00151602001518281518110614b8f57614b8f6151cf565b6020026020010151604051602001614ba89291906159df565b60408051601f198184030181529190529150600101614b63565b5060c0840151604051614bd9918391602001615a50565b6040516020818303038152906040529050600281604051614bfa9190615380565b602060405180830381855afa158015614c15573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c389190615144565b94909350915050565b6139f46139ab565b614c516139ab565b80355f80516020615ac28339815191529081556014614c7660608401604085016157e1565b60ff161180614c955750614c9060608301604084016157e1565b60ff16155b15614cc957614caa60608301604084016157e1565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614cd960608301604084016157e1565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d0a6040830160208401614f14565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c076139ab565b508054614d45906150f2565b5f825580601f10614d54575050565b601f0160209004905f5260205f2090810190610f759190614dad565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614dc1575f8155600101614dae565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614df7575f80fd5b833592506020840135614e0981614dc5565b9150614e1760408501614dd2565b90509250925092565b5f60208284031215614e30575f80fd5b5035919050565b5f8060408385031215614e48575f80fd5b82356001600160401b03811115614e5d575f80fd5b830160808186031215614e6e575f80fd5b9150614e7c60208401614dd2565b90509250929050565b5f6101208284031215614e96575f80fd5b50919050565b5f8060408385031215614ead575f80fd5b82359150614e7c60208401614dd2565b5f60208284031215614ecd575f80fd5b61169482614dd2565b5f8060408385031215614ee7575f80fd5b614ef083614dd2565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614f24575f80fd5b61169482614efe565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614f50575f80fd5b83356001600160401b03811115614f65575f80fd5b840160a08187031215614f76575f80fd5b9250614f8460208501614f2d565b9150614e1760408501614efe565b634e487b7160e01b5f52602160045260245ffd5b60068110614fb657614fb6614f92565b9052565b5f5b83811015614fd4578181015183820152602001614fbc565b50505f910152565b5f8151808452614ff3816020860160208601614fba565b601f01601f19169290920160200192915050565b60208152615019602082018351614fa6565b5f602083015160e06040840152615034610100840182614fdc565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615098575f80fd5b82356001600160401b03808211156150ae575f80fd5b818501915085601f8301126150c1575f80fd5b8135818111156150cf575f80fd5b8660208285010111156150e0575f80fd5b60209290920196919550909350505050565b600181811c9082168061510657607f821691505b602082108103614e9657634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614fa6565b602081525f6116946020830184614fdc565b5f60208284031215615154575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561517f575f80fd5b81356116948161515b565b5f808335601e1984360301811261519f575f80fd5b8301803591506001600160401b038211156151b8575f80fd5b6020019150600581901b3603821315613806575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126151f7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561523757615237615201565b60405290565b604080519081016001600160401b038111828210171561523757615237615201565b604051601f8201601f191681016001600160401b038111828210171561528757615287615201565b604052919050565b5f6001600160401b038211156152a7576152a7615201565b50601f01601f191660200190565b5f82601f8301126152c4575f80fd5b81356152d76152d28261528f565b61525f565b8181528460208386010111156152eb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615317575f80fd5b61531f615215565b82356001600160401b0380821115615335575f80fd5b615341368387016152b5565b83526020850135915080821115615356575f80fd5b50615363368286016152b5565b60208301525061537560408401614efe565b604082015292915050565b5f82516151f7818460208701614fba565b601f82111561063a57805f5260205f20601f840160051c810160208510156153b65750805b601f840160051c820191505b8181101561187d575f81556001016153c2565b81516001600160401b038111156153ee576153ee615201565b615402816153fc84546150f2565b84615391565b602080601f831160018114615435575f841561541e5750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561546357888601518255948401946001909101908401615444565b508582101561548057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea5615490565b5f63ffffffff8083168181036154cf576154cf615490565b6001019392505050565b5f826154f357634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061550c5761550c614f92565b91905290565b8082028115828204841417610ea557610ea5615490565b5f60208083525f845461553b816150f2565b806020870152604060018084165f811461555c5760018114615578576155a5565b60ff19851660408a0152604084151560051b8a010195506155a5565b895f5260205f205f5b8581101561559c5781548b8201860152908301908801615581565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561200157612001615490565b6001600160401b0382811682821603908082111561200157612001615490565b80516119ed81614dc5565b5f806040838503121561561e575f80fd5b82516001600160401b0380821115615634575f80fd5b9084019060608287031215615647575f80fd5b61564f615215565b825181526020808401516156628161515b565b82820152604084015183811115615677575f80fd5b80850194505087601f85011261568b575f80fd5b8351925061569b6152d28461528f565b83815288828587010111156156ae575f80fd5b6156bd84838301848801614fba565b806040840152508195506156d2818801615602565b9450505050509250929050565b81810381811115610ea557610ea5615490565b5f808335601e19843603018112615707575f80fd5b8301803591506001600160401b03821115615720575f80fd5b602001915036819003821315613806575f80fd5b5f8851615745818460208d01614fba565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146157c0576157c0615490565b505092915050565b5f602082840312156157d8575f80fd5b61169482614f2d565b5f602082840312156157f1575f80fd5b813560ff81168114611694575f80fd5b5f8235603e198336030181126151f7575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615853575f80fd5b61585b61523d565b61586483614dd2565b81526020808401356001600160401b0380821115615880575f80fd5b9085019036601f830112615892575f80fd5b8135818111156158a4576158a4615201565b8060051b91506158b584830161525f565b81815291830184019184810190368411156158ce575f80fd5b938501935b838510156158f857843592506158e88361515b565b82825293850193908501906158d3565b94860194909452509295945050505050565b5f6001600160401b038083168181036154cf576154cf615490565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161596b81602a850160208b01614fba565b86519083019061598281602a840160208b01614fba565b60c087901b6001600160c01b031916602a92909101918201526159b4603282018660e01b6001600160e01b0319169052565b6159cd603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516159f0818460208801614fba565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615a26818460208901614fba565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615a61818460208801614fba565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/ExampleRewardCalculator.sol b/contracts/validator-manager/ExampleRewardCalculator.sol index 79740d61a..1e73d8a0e 100644 --- a/contracts/validator-manager/ExampleRewardCalculator.sol +++ b/contracts/validator-manager/ExampleRewardCalculator.sol @@ -26,9 +26,7 @@ contract ExampleRewardCalculator is IRewardCalculator { uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, - uint64 uptimeSeconds, - uint256, // initialSupply - uint256 // endSupply + uint64 uptimeSeconds ) external view returns (uint256) { // Equivalent to uptimeSeconds/(validator.endedAt - validator.startedAt) < UPTIME_REWARDS_THRESHOLD_PERCENTAGE/100 // Rearranged to prevent integer division truncation. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 20f8f3cf6..d9c55e045 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -240,9 +240,7 @@ abstract contract PoSValidatorManager is validatorStartTime: validator.startedAt, stakingStartTime: validator.startedAt, stakingEndTime: validator.endedAt, - uptimeSeconds: uptimeSeconds, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: uptimeSeconds }); $._redeemableValidatorRewards[validationID] += reward; return (reward > 0); @@ -572,9 +570,7 @@ abstract contract PoSValidatorManager is validatorStartTime: validator.startedAt, stakingStartTime: delegator.startedAt, stakingEndTime: delegationEndTime, - uptimeSeconds: $._posValidatorInfo[delegator.validationID].uptimeSeconds, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: $._posValidatorInfo[delegator.validationID].uptimeSeconds }); } diff --git a/contracts/validator-manager/interfaces/IRewardCalculator.sol b/contracts/validator-manager/interfaces/IRewardCalculator.sol index 5ed55458c..e8c556e25 100644 --- a/contracts/validator-manager/interfaces/IRewardCalculator.sol +++ b/contracts/validator-manager/interfaces/IRewardCalculator.sol @@ -16,16 +16,12 @@ interface IRewardCalculator { * @param stakingStartTime The time the staker started staking * @param stakingEndTime The time the staker stopped staking * @param uptimeSeconds The total time the validator was validating - * @param initialSupply The total token supply at the start of the staking period - * @param endSupply The total token supply at the end of the staking period */ function calculateReward( uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, - uint64 uptimeSeconds, - uint256 initialSupply, - uint256 endSupply + uint64 uptimeSeconds ) external view returns (uint256); } diff --git a/contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol index 87b18020c..dc59a6409 100644 --- a/contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol @@ -28,9 +28,7 @@ contract ExampleRewardCalculatorTest is Test { validatorStartTime: DEFAULT_START_TIME, stakingStartTime: DEFAULT_START_TIME, stakingEndTime: DEFAULT_END_TIME, - uptimeSeconds: DEFAULT_UPTIME, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: DEFAULT_UPTIME }); assertEq(output, 42e8); } @@ -41,9 +39,7 @@ contract ExampleRewardCalculatorTest is Test { validatorStartTime: DEFAULT_START_TIME, stakingStartTime: DEFAULT_START_TIME, stakingEndTime: DEFAULT_END_TIME, - uptimeSeconds: DEFAULT_UPTIME - 1, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: DEFAULT_UPTIME - 1 }); assertEq(output, 0); } diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 645b5f99e..00ae5643f 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -546,9 +546,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP }); _completeEndDelegationWithChecks({ @@ -678,9 +676,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: validationEndTime - DEFAULT_REGISTRATION_TIMESTAMP, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: validationEndTime - DEFAULT_REGISTRATION_TIMESTAMP }); _completeEndDelegationWithChecks({ @@ -750,9 +746,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, - uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP }); uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; @@ -803,9 +797,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP }); uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; @@ -944,9 +936,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP }); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) @@ -979,9 +969,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, - uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP }); _completeEndValidationWithChecks({ @@ -1422,9 +1410,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorStartTime: completeRegistrationTimestamp, stakingStartTime: completeRegistrationTimestamp, stakingEndTime: completionTimestamp, - uptimeSeconds: completionTimestamp - completeRegistrationTimestamp, - initialSupply: 0, - endSupply: 0 + uptimeSeconds: completionTimestamp - completeRegistrationTimestamp }); _completeEndValidationWithChecks({ From 719c136e3bdc08d2fb766b398caa30132393e41d Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 09:33:40 -0400 Subject: [PATCH 06/35] Remove unaddressed todos --- contracts/validator-manager/ValidatorManager.sol | 1 - contracts/validator-manager/tests/ValidatorManagerTests.t.sol | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 03c87e8f2..b896f10b1 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -387,7 +387,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida validator.endedAt = uint64(block.timestamp); // Save the validator updates. - // TODO: Optimize storage writes here (probably don't need to write the whole value). $._validationPeriods[validationID] = validator; (, bytes32 messageID) = _setValidatorWeight(validationID, 0); diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 6de1e94f5..a8188d578 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -581,14 +581,14 @@ abstract contract ValidatorManagerTest is Test { }); } - // TODO this needs to be kept in line with the contract conversions, but we can't make external calls + // This needs to be kept in line with the contract conversions, but we can't make external calls // to the contract and use vm.expectRevert at the same time. // These are okay to use for PoA as well, because they're just used for conversions inside the tests. function _valueToWeight(uint256 value) internal pure returns (uint64) { return uint64(value / 1e12); } - // TODO this needs to be kept in line with the contract conversions, but we can't make external calls + // This needs to be kept in line with the contract conversions, but we can't make external calls // to the contract and use vm.expectRevert at the same time. // These are okay to use for PoA as well, because they're just used for conversions inside the tests. function _weightToValue(uint64 weight) internal pure returns (uint256) { From 1ed43017c23df2ff70b3f98ffa85a923605e9ffb Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 10:18:54 -0400 Subject: [PATCH 07/35] Update documentation for interfaces --- .../interfaces/IERC20TokenStakingManager.sol | 8 +++++- .../interfaces/INativeTokenStakingManager.sol | 4 +++ .../interfaces/IPoAValidatorManager.sol | 3 +-- .../interfaces/IPoSValidatorManager.sol | 27 ++++++++++--------- .../interfaces/IValidatorManager.sol | 16 +++++------ 5 files changed, 34 insertions(+), 24 deletions(-) diff --git a/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol index cb5ffb866..7dd299358 100644 --- a/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol @@ -13,10 +13,11 @@ import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; */ interface IERC20TokenStakingManager is IPoSValidatorManager { /** - * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. + * @notice Begins the validator registration process. Locks the specified ERC20 tokens in the contract as the stake. * @param registrationInput The inputs for a validator registration. * @param delegationFeeBips The fee that delegators must pay to delegate to this validator. * @param minStakeDuration The minimum amount of time this validator must be staked for in seconds. + * @param stakeAmount The amount of tokens of stake. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, @@ -25,6 +26,11 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { uint256 stakeAmount ) external returns (bytes32 validationID); + /** + * @notice Begins the delegator registration process. Locks the specified ERC20 tokens in the contract as the stake. + * @param validationID The ID of the validator to stake to. + * @param stakeAmount The amount of tokens of stake. + */ function initializeDelegatorRegistration( bytes32 validationID, uint256 stakeAmount diff --git a/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol b/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol index 13d5ad760..c1cc4a2c9 100644 --- a/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol +++ b/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol @@ -24,6 +24,10 @@ interface INativeTokenStakingManager is IPoSValidatorManager { uint64 minStakeDuration ) external payable returns (bytes32 validationID); + /** + * @notice Begins the delegator registration process. Locks the provided native asset in the contract as the stake. + * @param validationID The ID of the validator to stake to. + */ function initializeDelegatorRegistration(bytes32 validationID) external payable diff --git a/contracts/validator-manager/interfaces/IPoAValidatorManager.sol b/contracts/validator-manager/interfaces/IPoAValidatorManager.sol index 39d2b12e9..94c1663d3 100644 --- a/contracts/validator-manager/interfaces/IPoAValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoAValidatorManager.sol @@ -24,8 +24,7 @@ interface IPoAValidatorManager is IValidatorManager { /** * @notice Begins the process of ending an active validation period. The validation period must have been previously * started by a successful call to {completeValidatorRegistration} with the given validationID. - * Any rewards for this validation period will stop accruing when this function is called. - * @param validationID The ID of the validation being ended. + * @param validationID The ID of the validation period being ended. */ function initializeEndValidation(bytes32 validationID) external; } diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 7a2eb9dbd..b0f829ea5 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -45,7 +45,7 @@ struct Delegator { } /** - * @dev Describes the active state of a PoS Validator. Extends {IValidatorManager-Validator} + * @dev Describes the active state of a PoS Validator in addition the information in {IValidatorManager-Validator} */ struct PoSValidatorInfo { address owner; @@ -61,7 +61,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a delegator registration is initiated * @param delegationID The ID of the delegation - * @param validationID The ID of the validation period + * @param validationID The ID of the validation perdiod being delegated to * @param delegatorAddress The address of the delegator * @param nonce The message nonce used to update the validator weight * @param validatorWeight The updated validator weight that is sent to the P-Chain @@ -91,7 +91,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when delegator removal is initiated * @param delegationID The ID of the delegation - * @param validationID The ID of the validation period + * @param validationID The ID of the validation period the delegator was staked to */ event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID); @@ -126,11 +126,11 @@ interface IPoSValidatorManager is IValidatorManager { * for uptime-based rewards. This function is used to exit the validator set when rewards are expected. * The validation period must have been previously started by a successful call to {completeValidatorRegistration} with the given validationID. * Any rewards for this validation period will stop accruing when this function is called. + * Note: Reverts if the uptime is not eligible for rewards. * @param validationID The ID of the validation period being ended. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. If no uptime proof is provided, * the latest known uptime will be used. - * @param messageIndex The index of the Warp message to be received providing the uptime proof. Reverts if the uptime - * is not eligible for rewards. + * @param messageIndex The index of the Warp message to be received providing the uptime proof. */ function initializeEndValidation( bytes32 validationID, @@ -146,6 +146,7 @@ interface IPoSValidatorManager is IValidatorManager { * Any rewards for this validation period will stop accruing when this function is called. * @param validationID The ID of the validation period being ended. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. If no uptime proof is provided, + * the latest known uptime will be used. * @param messageIndex The index of the Warp message to be received providing the uptime proof. */ function forceInitializeEndValidation( @@ -155,12 +156,12 @@ interface IPoSValidatorManager is IValidatorManager { ) external; /** - * @notice Completes the delegator registration process by returning an acknowledgement of the registration of a + * @notice Completes the delegator registration process by submitting an acknowledgement of the registration of a * validationID from the P-Chain. After this function is called, the validator's weight is updated in the contract state. * Any P-Chain acknowledgement with a nonce greater than or equal to the nonce used to initialize registration of the * delegator is valid, as long as that nonce has been sent by the contract. For the purposes of computing delegation rewards, - * the delegation is considered active after this function is called. - * Note: only the specified delegation will be marked as registered, even if the validator weight update + * the delegation is considered active after this function is completed. + * Note: Only the specified delegation will be marked as registered, even if the validator weight update * message implicitly includes multiple weight changes. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. * @param delegationID The ID of the delegation being registered. @@ -172,7 +173,8 @@ interface IPoSValidatorManager is IValidatorManager { * The delegator must have been previously registered with the given validationID. For the purposes of computing delegation rewards, * the delegation period is considered ended when this function is called. Uses the supplied uptime proof to calculate rewards. * If none is provided in the call, the latest known uptime will be used. Reverts if the uptime is not eligible for rewards. - * Note that this function can only be called by the address that registered the delegation. + * Note: This function can only be called by the address that registered the delegation. + * Note: Reverts if the uptime is not eligible for rewards. * @param delegationID The ID of the delegation being removed. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. * If the validator has completed its validation period, it has already provided an uptime proof, so {includeUptimeProof} @@ -192,7 +194,7 @@ interface IPoSValidatorManager is IValidatorManager { * The delegator must have been previously registered with the given validationID. For the purposes of computing delegation rewards, * the delegation period is considered ended when this function is called. Uses the supplied uptime proof to calculate rewards. * If none is provided in the call, the latest known uptime will be used. Reverts if the uptime is not eligible for rewards. - * Note that this function can only be called by the address that registered the delegation. + * Note: This function can only be called by the address that registered the delegation. * @param delegationID The ID of the delegation being removed. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. * If the validator has completed its validation period, it has already provided an uptime proof, so {includeUptimeProof} @@ -220,7 +222,7 @@ interface IPoSValidatorManager is IValidatorManager { * Any P-Chain acknowledgement with a nonce greater than or equal to the nonce used to initialize the end of the * delegator's delegation is valid, as long as that nonce has been sent by the contract. This is because the validator * weight change pertaining to the delegation ending is included in any subsequent validator weight update messages. - * Note: only the specified delegation will be marked as completed, even if the validator weight update + * Note: Only the specified delegation will be marked as completed, even if the validator weight update * message implicitly includes multiple weight changes. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. * @param delegationID The ID of the delegation being removed. @@ -229,8 +231,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Withdraws the delegation fees from completed delegations to the owner of the validator. - * Can currently only be called once the validator has completed its validation period. - * @param validationID The ID of the validation being ended. + * @param validationID The ID of the validation period being ended. */ function claimDelegationFees(bytes32 validationID) external; } diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index 6d1b25c1f..1c2ae4ee4 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -96,8 +96,8 @@ struct ValidatorRegistrationInput { */ interface IValidatorManager { /** - * @notice Emitted when a new validation period is created by stake being locked in the manager contract. - * Note that this event does not mean that the validation period has been successfully registered on the P-Chain, + * @notice Emitted when a new validation period is created by locking stake in the manager contract. + * Note: This event does not mean that the validation period has been successfully registered on the P-Chain, * and rewards for this validation period will not begin accruing until the {ValidationPeriodRegistered} event is * emitted. * @param validationID The ID of the validation period being created. @@ -132,8 +132,8 @@ interface IValidatorManager { /** * @notice Emitted when the process of ending a registered validation period is started by calling - * {initializeEndValidation}. Note that the stake for this validation period remains locked until - * a {ValidationPeriodRemoved} event is emitted. + * {initializeEndValidation}. + * Note: The stake for this validation period remains locked until a {ValidationPeriodRemoved} event is emitted. * @param validationID The ID of the validation period being removed. * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain. * @param weight The weight of the validator being removed. @@ -156,7 +156,7 @@ interface IValidatorManager { /** * @notice Event emitted when validator weight is updated. - * @param validationID The ID of the validation period + * @param validationID The ID of the validation period being updated * @param nonce The message nonce used to update the validator weight * @param validatorWeight The updated validator weight that is sent to the P-Chain * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain @@ -203,9 +203,9 @@ interface IValidatorManager { /** * @notice Completes the process of ending a validation period by receiving an acknowledgement from the P-Chain * that the validation ID is not active and will never be active in the future. Returns the the stake associated - * with the validation. Note that this function can be used for successful validation periods that have been explicitly - * ended by calling {initializeEndValidation} or for validation periods that never began on the P-Chain due to the - * {registrationExpiry} being reached. + * with the validation. + * Note: This function can be used for successful validation periods that have been explicitly ended by calling + * {initializeEndValidation} or for validation periods that never began on the P-Chain due to the {registrationExpiry} being reached. * @param messageIndex The index of the Warp message to be received providing the proof the validation is not active * and never will be active on the P-Chain. */ From 5bf4c024eae161ec95c387ca98226db5c4befa45 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 11:37:49 -0400 Subject: [PATCH 08/35] Update documentation --- .../ERC20TokenStakingManager.sol | 18 +++-- .../ExampleRewardCalculator.sol | 1 + .../NativeTokenStakingManager.sol | 16 ++-- .../validator-manager/PoAValidatorManager.sol | 9 +++ .../validator-manager/PoSValidatorManager.sol | 73 ++++++++++++++++--- .../validator-manager/ValidatorManager.sol | 27 ++++--- .../validator-manager/ValidatorMessages.sol | 8 +- 7 files changed, 114 insertions(+), 38 deletions(-) diff --git a/contracts/validator-manager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol index f4e12e8cb..be5b27b59 100644 --- a/contracts/validator-manager/ERC20TokenStakingManager.sol +++ b/contracts/validator-manager/ERC20TokenStakingManager.sol @@ -97,7 +97,6 @@ contract ERC20TokenStakingManager is /** * @notice See {IERC20TokenStakingManager-initializeValidatorRegistration} - * Begins the validator registration process. Locks the configured ERC20 in the contract as the stake. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, @@ -111,9 +110,7 @@ contract ERC20TokenStakingManager is } /** - * @notice Begins the delegator registration process. Locks the configured ERC20 in the contract as the delegated stake. - * @param validationID The ID of the validation period being delegated to. - * @param delegationAmount The amount to be delegated. + * @notice See {IERC20TokenStakingManager-initializeDelegatorRegistration} */ function initializeDelegatorRegistration( bytes32 validationID, @@ -122,16 +119,25 @@ contract ERC20TokenStakingManager is return _initializeDelegatorRegistration(validationID, _msgSender(), delegationAmount); } - // Must be guarded with reentrancy guard for safe transfer from + /** + * @notice See {PoSValidatorManager-_lock} + * Note: Must be guarded with reentrancy guard for safe transfer from. + */ function _lock(uint256 value) internal virtual override returns (uint256) { return _getERC20StakingManagerStorage()._token.safeTransferFrom(value); } - // Must be guarded with reentrancy guard for safe transfer from + /** + * @notice See {PoSValidatorManager-_unlock} + * Note: Must be guarded with reentrancy guard for safe transfer. + */ function _unlock(address to, uint256 value) internal virtual override { _getERC20StakingManagerStorage()._token.safeTransfer(to, value); } + /** + * @notice See {PoSValidatorManager-_reward} + */ function _reward(address account, uint256 amount) internal virtual override { ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); $._token.mint(account, amount); diff --git a/contracts/validator-manager/ExampleRewardCalculator.sol b/contracts/validator-manager/ExampleRewardCalculator.sol index 79740d61a..228020c8d 100644 --- a/contracts/validator-manager/ExampleRewardCalculator.sol +++ b/contracts/validator-manager/ExampleRewardCalculator.sol @@ -20,6 +20,7 @@ contract ExampleRewardCalculator is IRewardCalculator { /** * @notice A linear, non-compounding reward calculation that rewards a set percentage of tokens per year. + * See {IRewardCalculator-calculateReward} */ function calculateReward( uint256 stakeAmount, diff --git a/contracts/validator-manager/NativeTokenStakingManager.sol b/contracts/validator-manager/NativeTokenStakingManager.sol index bc0a80bdb..d2dc03101 100644 --- a/contracts/validator-manager/NativeTokenStakingManager.sol +++ b/contracts/validator-manager/NativeTokenStakingManager.sol @@ -38,7 +38,7 @@ contract NativeTokenStakingManager is } /** - * @notice Initialize the ERC20 token staking manager + * @notice Initialize the native token staking manager * @dev Uses reinitializer(2) on the PoS staking contracts to make sure after migration from PoA, the PoS contracts can reinitialize with its needed values. * @param settings Initial settings for the PoS validator manager */ @@ -60,7 +60,6 @@ contract NativeTokenStakingManager is /** * @notice See {INativeTokenStakingManager-initializeValidatorRegistration}. - * Begins the validator registration process. Locks the provided native asset in the contract as the stake. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, @@ -73,8 +72,7 @@ contract NativeTokenStakingManager is } /** - * @notice Begins the delegator registration process. Locks the provided native asset in the contract as the delegated stake. - * @param validationID The ID of the validation period being delegated to. + * @notice See {INativeTokenStakingManager-initializeDelegatorRegistration}. */ function initializeDelegatorRegistration(bytes32 validationID) external @@ -85,15 +83,23 @@ contract NativeTokenStakingManager is return _initializeDelegatorRegistration(validationID, _msgSender(), msg.value); } - // solhint-enable ordering + /** + * @notice See {PoSValidatorManager-_lock} + */ function _lock(uint256 value) internal virtual override returns (uint256) { return value; } + /** + * @notice See {PoSValidatorManager-_unlock} + */ function _unlock(address to, uint256 value) internal virtual override { payable(to).sendValue(value); } + /** + * @notice See {PoSValidatorManager-_reward} + */ function _reward(address account, uint256 amount) internal virtual override { NATIVE_MINTER.mintNativeCoin(account, amount); } diff --git a/contracts/validator-manager/PoAValidatorManager.sol b/contracts/validator-manager/PoAValidatorManager.sol index d45a196a6..f9ceabbd9 100644 --- a/contracts/validator-manager/PoAValidatorManager.sol +++ b/contracts/validator-manager/PoAValidatorManager.sol @@ -48,6 +48,9 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU // solhint-enable func-name-mixedcase + /** + * @notice See {IPoAValidatorManager-initializeValidatorRegistration}. + */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, uint64 weight @@ -56,10 +59,16 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU } // solhint-enable ordering + /** + * @notice See {IPoAValidatorManager-initializeEndValidation}. + */ function initializeEndValidation(bytes32 validationID) external override onlyOwner { _initializeEndValidation(validationID); } + /** + * @notice See {IValidatorManager-completeEndValidation}. + */ function completeEndValidation(uint32 messageIndex) external { _completeEndValidation(messageIndex); } diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 20f8f3cf6..db9627215 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -49,7 +49,6 @@ abstract contract PoSValidatorManager is /** * @notice A multiplier applied to validator's initial stake amount to determine * the maximum amount of stake a validator can have with delegations. - * * Note: Setting this value to 1 would disable delegations to validators, since * the maximum stake would be equal to the initial stake. */ @@ -148,6 +147,9 @@ abstract contract PoSValidatorManager is $._rewardCalculator = rewardCalculator; } + /** + * @notice See {IPoSValidatorManager-submitUptimeProof}. + */ function submitUptimeProof(bytes32 validationID, uint32 messageIndex) external { if (!_isPoSValidator(validationID)) { revert ValidatorNotPoS(validationID); @@ -161,6 +163,9 @@ abstract contract PoSValidatorManager is _updateUptime(validationID, messageIndex); } + /** + * @notice See {IPoSValidatorManager-claimDelegationFees}. + */ function claimDelegationFees(bytes32 validationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -178,6 +183,9 @@ abstract contract PoSValidatorManager is _reward($._posValidatorInfo[validationID].owner, rewards); } + /** + * @notice See {IPoSValidatorManager-initializeEndValidation}. + */ function initializeEndValidation( bytes32 validationID, bool includeUptimeProof, @@ -188,6 +196,9 @@ abstract contract PoSValidatorManager is } } + /** + * @notice See {IPoSValidatorManager-forceInitializeEndValidation}. + */ function forceInitializeEndValidation( bytes32 validationID, bool includeUptimeProof, @@ -197,9 +208,11 @@ abstract contract PoSValidatorManager is _initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex); } - // Helper function that initializes the end of a PoS validation period. - // Returns false if it is possible for the validator to claim rewards, but it is not eligible. - // Returns true otherwise. + /** + * @dev Helper function that initializes the end of a PoS validation period. + * Returns false if it is possible for the validator to claim rewards, but it is not eligible. + * Returns true otherwise. + */ function _initializeEndPoSValidation( bytes32 validationID, bool includeUptimeProof, @@ -248,6 +261,9 @@ abstract contract PoSValidatorManager is return (reward > 0); } + /** + * @notice See {IValidatorManager-completeEndValidation}. + */ function completeEndValidation(uint32 messageIndex) external nonReentrant { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -267,12 +283,14 @@ abstract contract PoSValidatorManager is _reward(owner, rewards); } - // We unlock the stake whether the validation period is completed or invalidated. + // The stake is unlocked whether the validation period is completed or invalidated. _unlock(owner, weightToValue(validator.startingWeight)); } - // Helper function that extracts the uptime from a ValidationUptimeMessage Warp message - // If the uptime is greater than the stored uptime, update the stored uptime + /** + * @dev Helper function that extracts the uptime from a ValidationUptimeMessage Warp message + * If the uptime is greater than the stored uptime, update the stored uptime. + */ function _updateUptime(bytes32 validationID, uint32 messageIndex) internal returns (uint64) { (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); @@ -343,15 +361,33 @@ abstract contract PoSValidatorManager is return validationID; } + /** + * @notice Converts a token value to a weight. + * @param value Token value to convert. + */ function valueToWeight(uint256 value) public pure returns (uint64) { return uint64(value / 1e12); } + /** + * @notice Converts a weight to a token value. + * @param weight weight to convert. + */ function weightToValue(uint64 weight) public pure returns (uint256) { return uint256(weight) * 1e12; } + /** + * @notice Locks tokens in this contract. + * @param value Number of tokens to lock. + */ function _lock(uint256 value) internal virtual returns (uint256); + + /** + * @notice Unlocks token to a specific address. + * @param to Address to send token to. + * @param value Number of tokens to lock. + */ function _unlock(address to, uint256 value) internal virtual; function _initializeDelegatorRegistration( @@ -407,6 +443,9 @@ abstract contract PoSValidatorManager is return delegationID; } + /** + * @notice See {IPoSValidatorManager-completeDelegatorRegistration}. + */ function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -454,6 +493,9 @@ abstract contract PoSValidatorManager is }); } + /** + * @notice See {IPoSValidatorManager-initializeEndDelegation}. + */ function initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, @@ -464,6 +506,9 @@ abstract contract PoSValidatorManager is } } + /** + * @notice See {IPoSValidatorManager-forceInitializeEndDelegation}. + */ function forceInitializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, @@ -473,9 +518,11 @@ abstract contract PoSValidatorManager is _initializeEndDelegation(delegationID, includeUptimeProof, messageIndex); } - // Helper function that initializes the end of a PoS delegation period. - // Returns false if it is possible for the delegator to claim rewards, but it is not eligible. - // Returns true otherwise. + /** + * @dev Helper function that initializes the end of a PoS delegation period. + * Returns false if it is possible for the delegator to claim rewards, but it is not eligible. + * Returns true otherwise. + */ function _initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, @@ -533,7 +580,7 @@ abstract contract PoSValidatorManager is _completeEndDelegation(delegationID); // If the validator has completed, then no further uptimes may be submitted, so we always - // end the delegation + // end the delegation. return true; } else { revert InvalidValidatorStatus(validator.status); @@ -579,6 +626,7 @@ abstract contract PoSValidatorManager is } /** + * @notice See {IPoSValidatorManager-resendUpdateDelegation}. * @dev Resending the latest validator weight with the latest nonce is safe because all weight changes are * cumulative, so the latest weight change will always include the weight change for any added delegators. */ @@ -605,6 +653,9 @@ abstract contract PoSValidatorManager is ); } + /** + * @notice See {IPoSValidatorManager-completeEndDelegation}. + */ function completeEndDelegation( uint32 messageIndex, bytes32 delegationID diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 03c87e8f2..0135cd2ad 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -302,8 +302,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida } /** - * @notice Resubmits a validator registration message to be sent to P-Chain to the Warp precompile. - * Only necessary if the original message can't be delivered due to validator churn. + * @notice See {IValidatorManager-resendRegisterValidatorMessage}. */ function resendRegisterValidatorMessage(bytes32 validationID) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); @@ -320,9 +319,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida } /** - * @notice Completes the validator registration process by returning an acknowledgement of the registration of a - * validationID from the P-Chain. - * @param messageIndex The index of the Warp message to be received providing the acknowledgement. + * @notice See {IValidatorManager-completeValidatorRegistration}. */ function completeValidatorRegistration(uint32 messageIndex) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); @@ -348,11 +345,19 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); } + /** + * @notice Returns a validation ID registered to the given nodeID + * @param nodeID ID of the node associated with the validation ID + */ function registeredValidators(bytes calldata nodeID) public view returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); return $._registeredValidators[nodeID]; } + /** + * @notice Returns a validator registered to the given validationID + * @param validationID ID of the validation period associated with the validator + */ function getValidator(bytes32 validationID) public view returns (Validator memory) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); return $._validationPeriods[validationID]; @@ -362,7 +367,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida * @notice Begins the process of ending an active validation period. The validation period must have been previously * started by a successful call to {completeValidatorRegistration} with the given validationID. * Any rewards for this validation period will stop accruing when this function is called. - * @param validationID The ID of the validation being ended. + * @param validationID The ID of the validation period being ended. */ function _initializeEndValidation(bytes32 validationID) internal @@ -399,10 +404,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida } /** - * @notice Resubmits a validator end message to be sent to P-Chain to the Warp precompile. - * Only necessary if the original message can't be delivered due to validator churn. + * @notice See {IValidatorManager-resendEndValidatorMessage}. */ - // solhint-disable-next-line function resendEndValidatorMessage(bytes32 validationID) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); Validator memory validator = $._validationPeriods[validationID]; @@ -422,10 +425,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida /** * @notice Completes the process of ending a validation period by receiving an acknowledgement from the P-Chain * that the validation ID is not active and will never be active in the future. - * Note that this function can be used for successful validation periods that have been explicitly + * Note: that this function can be used for successful validation periods that have been explicitly * ended by calling {initializeEndValidation} or for validation periods that never began on the P-Chain due to the * {registrationExpiry} being reached. - * @return The Validator instance representing the completed validation period and the corresponding validation ID. + * @return (Validation ID, Validator instance) representing the completed validation period. */ function _completeEndValidation(uint32 messageIndex) internal @@ -471,7 +474,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida /** * @notice Returns the validator's weight. This weight is not guaranteed to be known by the P-Chain - * @return The weight of the validator. If the validation ID does not exist, the weight will be 0. + * @return Weight of the validator. If the validation ID does not exist, the weight will be 0. */ function getWeight(bytes32 validationID) external view returns (uint64) { return getValidator(validationID).weight; diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 272edf795..e7953e11e 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -79,7 +79,7 @@ library ValidatorMessages { * The message format specification is the same as the one used in above for packing. * * @param input The byte array to unpack. - * @return the unpacked subnetConversionID. + * @return The unpacked subnetConversionID. */ function unpackSubnetConversionMessage(bytes memory input) internal pure returns (bytes32) { if (input.length != 38) { @@ -259,7 +259,7 @@ library ValidatorMessages { * The message format specification is the same as the one used in above for packing. * * @param input The byte array to unpack. - * @return the unpacked ValidationPeriod. + * @return The unpacked ValidationPeriod. */ function unpackRegisterSubnetValidatorMessage(bytes memory input) internal @@ -466,8 +466,8 @@ library ValidatorMessages { * The message format specification is the same as the one used in above for packing. * * @param input The byte array to unpack. - * @return The validationID and whether the validation period was registered - * or is not a validator and never will be a validator to do the expiry time passing. + * @return The validationID and whether the validation period was registered or is not a + * validator and never will be a validator due to the expiry time passing. */ function unpackSubnetValidatorRegistrationMessage(bytes memory input) internal From b26035f9e55d70c217bc8c75a4106efbd6df5769 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 14:16:58 -0400 Subject: [PATCH 09/35] Minimum stake duration must be at least as long as churn period --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 28 +++++++++++++------ .../validator-manager/ValidatorManager.sol | 4 +++ 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index c6cd32649..0b496a6b7 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -91,7 +91,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f8b380380615f8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e3e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b61020961020436600461505c565b6104a8565b005b610209610219366004615097565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b36600461505c565b6106eb565b61020961025e3660046150ae565b6106f6565b6102096102713660046150fc565b610be2565b610289610284366004615097565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb36600461505c565b610c6c565b6102096102de36600461511d565b610c77565b6102f66102f136600461515d565b610d39565b604051908152602001610234565b6102096103123660046151c2565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f66103423660046151ea565b610fd9565b610289610355366004615097565b610ff2565b6102f65f81565b61020961036f36600461505c565b611006565b610226603081565b61020961038a366004615097565b611031565b61020961039d3660046151c2565b6110fc565b6102f66103b0366004615203565b6112d4565b6102096103c336600461511d565b611300565b6102f65f80516020615db283398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004615097565b611489565b6102f65f80516020615dd283398151915281565b610209610437366004615097565b611672565b610226601481565b610457610452366004615097565b6117af565b6040516102349190615298565b6102896202a30081565b6102f65f80516020615d9283398151915281565b61020961049036600461532c565b6118fe565b6102f66104a336600461536a565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff16600581111561052a5761052a615223565b600581111561053b5761053b615223565b815260200160018201805461054f906153d5565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906153d5565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063157610631615223565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d46565b6040518263ffffffff1660e01b81526004016106a5919061541b565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e5919061542d565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615dd28339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af919061542d565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e96060850160408601615444565b6001600160a01b03161461082c576108076060840160408501615444565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a606085018561545f565b905090505f805b828163ffffffff161015610b22575f61085d606088018861545f565b8363ffffffff16818110610873576108736154a4565b905060200281019061088591906154b8565b61088e906155dc565b80516040519192505f9160088801916108a691615655565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf919060040161541b565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f91615655565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d919061542d565b90508086600801835f01516040516109759190615655565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f7615223565b021790555060208201516001820190610a1090826156aa565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab5911685615779565b8251604051919550610ac691615655565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b9061578c565b9050610841565b50600483018190555f610b40610b3786611d95565b60400151611eab565b90505f610b4c87612038565b90505f600282604051610b5f9190615655565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d919061542d565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612212565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c615223565b14610c4c578060405163170cc93360e21b81526004016104cf919061540d565b6106e5838361224d565b5f610c6664e8d4a51000836157ae565b92915050565b6106e58383836124c7565b610c7f6126c0565b5f80516020615db28339815191525f80610c98846126f7565b91509150610ca582612212565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce0615223565b03610d05575f83815260078501602052604081208054919055610d038282612a35565b505b610d1b81610d168460400151610fd9565b612aab565b505050505b610d3660015f80516020615df283398151915255565b50565b5f610d426126c0565b610d4e85858585612ae1565b9050610d6660015f80516020615df283398151915255565b949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115610dbb57610dbb615223565b6003811115610dcc57610dcc615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e59615223565b14610e7a578251604051633b0d540d60e21b81526104cf91906004016157cd565b600481516005811115610e8f57610e8f615223565b03610ea557610e9d85612cba565b505050505050565b5f80610ebc610eb389611d95565b60400151612ea1565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a510006157e7565b5f610ffc826117af565b6080015192915050565b6110118383836124c7565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615db28339815191525f611049836117af565b519050600481600581111561106057611060615223565b14611080578060405163170cc93360e21b81526004016104cf919061540d565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a35565b6111046126c0565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff16600381111561115157611151615223565b600381111561116257611162615223565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db615223565b146111fc578051604051633b0d540d60e21b81526104cf91906004016157cd565b600461120b82604001516117af565b51600581111561121d5761121d615223565b146112af575f61122c85611d95565b90505f8061123d8360400151612ea1565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612cba565b50506112d060015f80516020615df283398151915255565b5050565b5f6112dd6126c0565b6112e88333846130f7565b9050610c6660015f80516020615df283398151915255565b5f80516020615dd28339815191525f8061132561131c85611d95565b604001516133cf565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f82815260068401602052604090208054611365906153d5565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af615223565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068401602052604081206113fa91614fab565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff1660038111156114d6576114d6615223565b60038111156114e7576114e7615223565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561156057611560615223565b14158015611581575060038151600381111561157e5761157e615223565b14155b156115a2578051604051633b0d540d60e21b81526104cf91906004016157cd565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d46565b6040518263ffffffff1660e01b815260040161162b919061541b565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b919061542d565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615dd283398151915291906116b9906153d5565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff16600581111561170357611703615223565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016157fe565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d8919061542d565b6117b7614fe2565b5f8281525f80516020615e12833981519152602052604090819020815160e0810190925280545f80516020615dd2833981519152929190829060ff16600581111561180457611804615223565b600581111561181557611815615223565b8152602001600182018054611829906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611855906153d5565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611990848461358b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615dd2833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615888565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db28339815191529284929091829060ff166003811115611a8657611a86615223565b6003811115611a9757611a97615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b24615223565b14611b45578251604051633b0d540d60e21b81526104cf91906004016157cd565b60208301516001600160a01b03163314611be8575f828152600485016020526040902054336001600160a01b0390911603611be2575f82815260048501602052604090205460a0820151611ba991600160b01b90046001600160401b031690615897565b6001600160401b0316421015611bdd5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b611be8565b336110a1565b600281516005811115611bfd57611bfd615223565b03611cda578615611c1457611c12828761224d565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c4d918491611c4891906158b7565b6135a5565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c8e846136fc565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d3f9350505050565b600481516005811115611cef57611cef615223565b03611d2357611cfd836136fc565b5f898152600686016020526040902055611d1688612cba565b6001945050505050611d3f565b805160405163170cc93360e21b81526104cf919060040161540d565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e2091908101906158e2565b9150915080611e4257604051636b2f19e960e01b815260040160405180910390fd5b815115611e68578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611ea4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611ee057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f2f57611ef78160016159b4565b611f029060086157e7565b61ffff16848281518110611f1857611f186154a4565b016020015160f81c901b9190911790600101611ee3565b5061ffff811615611f595760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611fb457611f708160036159b4565b611f7b9060086157e7565b63ffffffff1685611f8d836002615779565b81518110611f9d57611f9d6154a4565b016020015160f81c901b9190911790600101611f5c565b5063ffffffff811615611fda57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561202f57611ff181601f6159b4565b611ffc9060086157e7565b86612008836006615779565b81518110612018576120186154a4565b016020015160f81c901b9190911790600101611fdd565b50949350505050565b60605f8083356020850135601461205487870160408901615444565b612061606089018961545f565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6120e7606085018561545f565b9050811015611ea457816120fe606086018661545f565b8381811061210e5761210e6154a4565b905060200281019061212091906154b8565b61212a90806159c7565b9050612139606087018761545f565b84818110612149576121496154a4565b905060200281019061215b91906154b8565b61216590806159c7565b612172606089018961545f565b86818110612182576121826154a4565b905060200281019061219491906154b8565b6121a29060208101906159c7565b6121af60608b018b61545f565b888181106121bf576121bf6154a4565b90506020028101906121d191906154b8565b6121e29060608101906040016151ea565b6040516020016121f89796959493929190615a09565b60408051601f1981840301815291905291506001016120da565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612298573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122bf91908101906158e2565b91509150806122e157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612324573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612348919061542d565b82511461236e578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123aa576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f806123b984604001516138a8565b915091508187146123e05760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615db2833981519152906001600160401b03908116908316111561249d575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26124bc565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615db2833981519152816124e086613a99565b90506124eb86612212565b6124fa57600192505050611d3f565b5f8681526004830160205260409020546001600160a01b0316331461251f57336110a1565b5f86815260048301602052604090205460a082015161254e91600160b01b90046001600160401b031690615897565b6001600160401b03168160c001516001600160401b031610156125955760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125ad576125a6878661224d565b90506125cb565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906125f090610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268a919061542d565b905080846007015f8a81526020019081526020015f205f8282546126ae9190615779565b90915550501515979650505050505050565b5f80516020615df28339815191528054600119016126f157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612700614fe2565b5f80516020615dd28339815191525f8061271c61131c87611d95565b91509150801561274357604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561277457612774615223565b600581111561278557612785615223565b8152602001600182018054612799906153d5565b80601f01602080910402602001604051908101604052809291908181526020018280546127c5906153d5565b80156128105780601f106127e757610100808354040283529160200191612810565b820191905f5260205f20905b8154815290600101906020018083116127f357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561287b5761287b615223565b1415801561289c575060018151600581111561289957612899615223565b14155b156128bd57805160405163170cc93360e21b81526104cf919060040161540d565b6003815160058111156128d2576128d2615223565b036128e057600481526128e5565b600581525b8360080181602001516040516128fb9190615655565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561293f5761293f615223565b02179055506020820151600182019061295890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129fe576129fe615223565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a90575f80fd5b505af1158015612aa2573d5f803e3d5ffd5b50505050505050565b5f80516020615d92833981519152546112d0906001600160a01b03168383613d7d565b60015f80516020615df283398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615db283398151915290600160401b900461ffff9081169086161080612b35575061271061ffff8616115b15612b5957604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b95576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612ba75750806001015483115b15612bc85760405163222d164360e21b8152600481018490526024016104cf565b5f612bd284613ddc565b90505f612bde82610c56565b90505f612beb8983613dff565b90506040518060800160405280612bff3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115612d0757612d07615223565b6003811115612d1857612d18615223565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e46575f84815260048701602052604090205461271090612df890600160a01b900461ffff16856157e7565b612e0291906157ae565b915081866007015f8681526020019081526020015f205f828254612e269190615779565b90915550612e36905082846159b4565b9050612e46856020015182612a35565b612e5b8560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ed857835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f2757612eef8160016159b4565b612efa9060086157e7565b61ffff16868281518110612f1057612f106154a4565b016020015160f81c901b9190911790600101612edb565b5061ffff811615612f515760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612fac57612f688160036159b4565b612f739060086157e7565b63ffffffff1687612f85836002615779565b81518110612f9557612f956154a4565b016020015160f81c901b9190911790600101612f54565b5063ffffffff8116600314612fd457604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561302957612feb81601f6159b4565b612ff69060086157e7565b88613002836006615779565b81518110613012576130126154a4565b016020015160f81c901b9190911790600101612fd7565b505f805b6008811015613088576130418160076159b4565b61304c9060086157e7565b6001600160401b031689613061836026615779565b81518110613071576130716154a4565b016020015160f81c901b919091179060010161302d565b505f805b60088110156130e7576130a08160076159b4565b6130ab9060086157e7565b6001600160401b03168a6130c083602e615779565b815181106130d0576130d06154a4565b016020015160f81c901b919091179060010161308c565b5091989097509095509350505050565b5f5f80516020615db28339815191528161311361028485613ddc565b90505f61311f876117af565b905061312a87612212565b61314a576040516330efa98b60e01b8152600481018890526024016104cf565b60028151600581111561315f5761315f615223565b1461318057805160405163170cc93360e21b81526104cf919060040161540d565b5f8282608001516131919190615897565b905083600201600a9054906101000a90046001600160401b031682604001516131ba9190615a72565b6001600160401b0316816001600160401b031611156131f757604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806132038a846135a5565b915091505f8a8360405160200161323192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132c4576132c4615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461340557825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156134545761341c8160016159b4565b6134279060086157e7565b61ffff1685828151811061343d5761343d6154a4565b016020015160f81c901b9190911790600101613408565b5061ffff81161561347e5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134d9576134958160036159b4565b6134a09060086157e7565b63ffffffff16866134b2836002615779565b815181106134c2576134c26154a4565b016020015160f81c901b9190911790600101613481565b5063ffffffff811660021461350157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135565761351881601f6159b4565b6135239060086157e7565b8761352f836006615779565b8151811061353f5761353f6154a4565b016020015160f81c901b9190911790600101613504565b505f8660268151811061356b5761356b6154a4565b016020015191976001600160f81b03199092161515965090945050505050565b613593614377565b61359c826143c2565b6112d081614430565b5f8281525f80516020615e12833981519152602052604081206002015481905f80516020615dd283398151915290600160801b90046001600160401b03166135ed8582614498565b5f6135f787614672565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136478a858b611d46565b6040518263ffffffff1660e01b8152600401613663919061541b565b6020604051808303815f875af115801561367f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a3919061542d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615db283398151915290505f61371c84604001516117af565b90505f60038251600581111561373457613734615223565b1480613752575060048251600581111561375057613750615223565b145b15613762575060c081015161379f565b60028251600581111561377757613777615223565b0361378357504261379f565b815160405163170cc93360e21b81526104cf919060040161540d565b84608001516001600160401b0316816001600160401b0316116137c657505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137eb90610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561387b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061389f919061542d565b95945050505050565b5f808251602e146138de57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b600281101561392d576138f58160016159b4565b6139009060086157e7565b61ffff16858281518110613916576139166154a4565b016020015160f81c901b91909117906001016138e1565b5061ffff8116156139575760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139b25761396e8160036159b4565b6139799060086157e7565b63ffffffff168661398b836002615779565b8151811061399b5761399b6154a4565b016020015160f81c901b919091179060010161395a565b5063ffffffff8116156139d857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a2d576139ef81601f6159b4565b6139fa9060086157e7565b87613a06836006615779565b81518110613a1657613a166154a4565b016020015160f81c901b91909117906001016139db565b505f805b6008811015613a8c57613a458160076159b4565b613a509060086157e7565b6001600160401b031688613a65836026615779565b81518110613a7557613a756154a4565b016020015160f81c901b9190911790600101613a31565b5090969095509350505050565b613aa1614fe2565b5f8281525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff166005811115613aee57613aee615223565b6005811115613aff57613aff615223565b8152602001600182018054613b13906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054613b3f906153d5565b8015613b8a5780601f10613b6157610100808354040283529160200191613b8a565b820191905f5260205f20905b815481529060010190602001808311613b6d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613bf857613bf8615223565b14613c2b575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c6f57613c6f615223565b021790555060208201516001820190613c8890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d2685826135a5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146e7565b5f610c66825f80516020615d92833981519152546001600160a01b031690614748565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e4357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615dd283398151915242613e6260608601604087016151ea565b6001600160401b0316111580613e9c5750613e806202a30042615779565b613e9060608601604087016151ea565b6001600160401b031610155b15613ed657613eb160608501604086016151ea565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613eeb613ee66060860186615a9d565b6148a1565b613efb613ee66080860186615a9d565b6030613f0a60208601866159c7565b905014613f3c57613f1e60208501856159c7565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f4684806159c7565b90505f03613f7357613f5884806159c7565b604051633e08a12560e11b81526004016104cf929190615ab1565b5f60088201613f8286806159c7565b604051613f90929190615888565b90815260200160405180910390205414613fc957613fae84806159c7565b60405163a41f772f60e01b81526004016104cf929190615ab1565b613fd3835f614498565b6040805160e08101909152815481525f9081906140df9060208101613ff889806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614040908a018a6159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161408960608a0160408b016151ea565b6001600160401b031681526020016140a460608a018a615a9d565b6140ad90615adf565b81526020016140bf60808a018a615a9d565b6140c890615adf565b8152602001876001600160401b0316815250614a0a565b5f828152600686016020526040902091935091506140fd82826156aa565b50816008840161410d88806159c7565b60405161411b929190615888565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061415790859060040161541b565b6020604051808303815f875af1158015614173573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614197919061542d565b6040805160e0810190915290915080600181526020016141b789806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561424657614246615223565b02179055506020820151600182019061425f90826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806142fd88806159c7565b60405161430b929190615888565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061434991906151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143c057604051631afcd79f60e31b815260040160405180910390fd5b565b6143ca614377565b6143d381614bf7565b6143db614c10565b610d36606082013560808301356143f860c0850160a086016151ea565b61440860e0860160c08701615ba6565b614419610100870160e08801615bbf565b61442b61012088016101008901615444565b614c20565b614438614377565b5f80516020615d928339815191526001600160a01b03821661447857604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615dd28339815191525f6001600160401b0380841690851611156144cc576144c583856158b7565b90506144d9565b6144d684846158b7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061453b575060018401548151614537916001600160401b031690615779565b8210155b15614561576001600160401b038316606082015281815260408101516020820152614580565b82816060018181516145739190615897565b6001600160401b03169052505b6060810151614590906064615a72565b602082015160018601546001600160401b0392909216916145bb9190600160401b900460ff166157e7565b10156145eb57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516146069190615779565b9052506040810180516001600160401b03871691906146269083906159b4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615e128339815191526020526040812060020180545f80516020615dd283398151915291906008906146bc90600160401b90046001600160401b0316615bdf565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146fb6001600160a01b03841683614d4f565b905080515f1415801561471f57508080602001905181019061471d9190615bfa565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561478e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147b2919061542d565b90506147c96001600160a01b038516333086614d5c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561480d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614831919061542d565b90508181116148975760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b61389f82826159b4565b6148ae602082018261511d565b63ffffffff161580156148ce57506148c9602082018261545f565b151590505b15614915576148e0602082018261511d565b6148ed602083018361545f565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b614922602082018261545f565b9050614931602083018361511d565b63ffffffff16111561494a576148e0602082018261511d565b60015b61495a602083018361545f565b90508110156112d057614970602083018361545f565b61497b6001846159b4565b81811061498a5761498a6154a4565b905060200201602081019061499f9190615444565b6001600160a01b03166149b5602084018461545f565b838181106149c5576149c56154a4565b90506020020160208101906149da9190615444565b6001600160a01b03161015614a0257604051630dbc8d5f60e31b815260040160405180910390fd5b60010161494d565b5f6060826040015151603014614a335760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a74988a986001989297929690959094909390929101615c15565b60405160208183030381529060405290505f5b84608001516020015151811015614ae657818560800151602001518281518110614ab357614ab36154a4565b6020026020010151604051602001614acc929190615ccf565b60408051601f198184030181529190529150600101614a87565b5060a0840151805160209182015151604051614b06938593929101615d05565b60405160208183030381529060405290505f5b8460a001516020015151811015614b7857818560a00151602001518281518110614b4557614b456154a4565b6020026020010151604051602001614b5e929190615ccf565b60408051601f198184030181529190529150600101614b19565b5060c0840151604051614b8f918391602001615d40565b6040516020818303038152906040529050600281604051614bb09190615655565b602060405180830381855afa158015614bcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bee919061542d565b94909350915050565b614bff614377565b614c07614d95565b610d3681614d9d565b614c18614377565b6143c0614e85565b614c28614377565b5f80516020615db283398151915261ffff84161580614c4c575061271061ffff8516115b15614c7057604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c945760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614ca75750600a60ff8416115b15614cca5760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d3f83835f614e8d565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613daa565b6143c0614377565b614da5614377565b80355f80516020615dd28339815191529081556014614dca6060840160408501615bbf565b60ff161180614de95750614de46060830160408401615bbf565b60ff16155b15614e1d57614dfe6060830160408401615bbf565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614e2d6060830160408401615bbf565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e5e60408301602084016151ea565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ace614377565b606081471015614eb25760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614ecd9190615655565b5f6040518083038185875af1925050503d805f8114614f07576040519150601f19603f3d011682016040523d82523d5f602084013e614f0c565b606091505b5091509150614f1c868383614f26565b9695505050505050565b606082614f3b57614f3682614f82565b611d3f565b8151158015614f5257506001600160a01b0384163b155b15614f7b57604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d3f565b805115614f925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614fb7906153d5565b5f825580601f10614fc6575050565b601f0160209004905f5260205f2090810190610d36919061501f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615033575f8155600101615020565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114615057575f80fd5b919050565b5f805f6060848603121561506e575f80fd5b83359250602084013561508081615037565b915061508e60408501615044565b90509250925092565b5f602082840312156150a7575f80fd5b5035919050565b5f80604083850312156150bf575f80fd5b82356001600160401b038111156150d4575f80fd5b8301608081860312156150e5575f80fd5b91506150f360208401615044565b90509250929050565b5f806040838503121561510d575f80fd5b823591506150f360208401615044565b5f6020828403121561512d575f80fd5b611d3f82615044565b803561ffff81168114615057575f80fd5b80356001600160401b0381168114615057575f80fd5b5f805f8060808587031215615170575f80fd5b84356001600160401b03811115615185575f80fd5b850160a08188031215615196575f80fd5b93506151a460208601615136565b92506151b260408601615147565b9396929550929360600135925050565b5f80604083850312156151d3575f80fd5b6151dc83615044565b946020939093013593505050565b5f602082840312156151fa575f80fd5b611d3f82615147565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061524757615247615223565b9052565b5f5b8381101561526557818101518382015260200161524d565b50505f910152565b5f815180845261528481602086016020860161524b565b601f01601f19169290920160200192915050565b602081526152aa602082018351615237565b5f602083015160e060408401526152c561010084018261526d565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f8082840361014081121561533f575f80fd5b6101208082121561534e575f80fd5b849350830135905061535f81615318565b809150509250929050565b5f806020838503121561537b575f80fd5b82356001600160401b0380821115615391575f80fd5b818501915085601f8301126153a4575f80fd5b8135818111156153b2575f80fd5b8660208285010111156153c3575f80fd5b60209290920196919550909350505050565b600181811c908216806153e957607f821691505b60208210810361540757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c668284615237565b602081525f611d3f602083018461526d565b5f6020828403121561543d575f80fd5b5051919050565b5f60208284031215615454575f80fd5b8135611d3f81615318565b5f808335601e19843603018112615474575f80fd5b8301803591506001600160401b0382111561548d575f80fd5b6020019150600581901b36038213156136f5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154cc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561550c5761550c6154d6565b60405290565b604080519081016001600160401b038111828210171561550c5761550c6154d6565b604051601f8201601f191681016001600160401b038111828210171561555c5761555c6154d6565b604052919050565b5f6001600160401b0382111561557c5761557c6154d6565b50601f01601f191660200190565b5f82601f830112615599575f80fd5b81356155ac6155a782615564565b615534565b8181528460208386010111156155c0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155ec575f80fd5b6155f46154ea565b82356001600160401b038082111561560a575f80fd5b6156163683870161558a565b8352602085013591508082111561562b575f80fd5b506156383682860161558a565b60208301525061564a60408401615147565b604082015292915050565b5f82516154cc81846020870161524b565b601f8211156104d857805f5260205f20601f840160051c8101602085101561568b5750805b601f840160051c820191505b8181101561166b575f8155600101615697565b81516001600160401b038111156156c3576156c36154d6565b6156d7816156d184546153d5565b84615666565b602080601f83116001811461570a575f84156156f35750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561573857888601518255948401946001909101908401615719565b508582101561575557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c66615765565b5f63ffffffff8083168181036157a4576157a4615765565b6001019392505050565b5f826157c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157e1576157e1615223565b91905290565b8082028115828204841417610c6657610c66615765565b5f60208083525f8454615810816153d5565b806020870152604060018084165f8114615831576001811461584d5761587a565b60ff19851660408a0152604084151560051b8a0101955061587a565b895f5260205f205f5b858110156158715781548b8201860152908301908801615856565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611ea457611ea4615765565b6001600160401b03828116828216039080821115611ea457611ea4615765565b805161505781615037565b5f80604083850312156158f3575f80fd5b82516001600160401b0380821115615909575f80fd5b908401906060828703121561591c575f80fd5b6159246154ea565b8251815260208084015161593781615318565b8282015260408401518381111561594c575f80fd5b80850194505087601f850112615960575f80fd5b835192506159706155a784615564565b8381528882858701011115615983575f80fd5b6159928483830184880161524b565b806040840152508195506159a78188016158d7565b9450505050509250929050565b81810381811115610c6657610c66615765565b5f808335601e198436030181126159dc575f80fd5b8301803591506001600160401b038211156159f5575f80fd5b6020019150368190038213156136f5575f80fd5b5f8851615a1a818460208d0161524b565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615a9557615a95615765565b505092915050565b5f8235603e198336030181126154cc575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615aef575f80fd5b615af7615512565b615b0083615044565b81526020808401356001600160401b0380821115615b1c575f80fd5b9085019036601f830112615b2e575f80fd5b813581811115615b4057615b406154d6565b8060051b9150615b51848301615534565b8181529183018401918481019036841115615b6a575f80fd5b938501935b83851015615b945784359250615b8483615318565b8282529385019390850190615b6f565b94860194909452509295945050505050565b5f60208284031215615bb6575f80fd5b611d3f82615136565b5f60208284031215615bcf575f80fd5b813560ff81168114611d3f575f80fd5b5f6001600160401b038083168181036157a4576157a4615765565b5f60208284031215615c0a575f80fd5b8151611d3f81615037565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615c5b81602a850160208b0161524b565b865190830190615c7281602a840160208b0161524b565b60c087901b6001600160c01b031916602a9290910191820152615ca4603282018660e01b6001600160e01b0319169052565b615cbd603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ce081846020880161524b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615d1681846020890161524b565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615d5181846020880161524b565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161603c38038061603c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615eef8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b61020961020436600461510d565b6104a8565b005b610209610219366004615148565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b36600461510d565b6106eb565b61020961025e36600461515f565b6106f6565b6102096102713660046151ad565b610be2565b610289610284366004615148565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb36600461510d565b610c6c565b6102096102de3660046151ce565b610c77565b6102f66102f136600461520e565b610d39565b604051908152602001610234565b610209610312366004615273565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f661034236600461529b565b610fd9565b610289610355366004615148565b610ff2565b6102f65f81565b61020961036f36600461510d565b611006565b610226603081565b61020961038a366004615148565b611031565b61020961039d366004615273565b6110fc565b6102f66103b03660046152b4565b6112d4565b6102096103c33660046151ce565b611300565b6102f65f80516020615e6383398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004615148565b611489565b6102f65f80516020615e8383398151915281565b610209610437366004615148565b611672565b610226601481565b610457610452366004615148565b6117af565b6040516102349190615349565b6102896202a30081565b6102f65f80516020615e4383398151915281565b6102096104903660046153dd565b6118fe565b6102f66104a336600461541b565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615ec38339815191526020526040808220815160e0810190925280545f80516020615e8383398151915293929190829060ff16600581111561052a5761052a6152d4565b600581111561053b5761053b6152d4565b815260200160018201805461054f90615486565b80601f016020809104026020016040519081016040528092919081815260200182805461057b90615486565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115610631576106316152d4565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d90565b6040518263ffffffff1660e01b81526004016106a591906154cc565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e591906154de565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615e838339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af91906154de565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e960608501604086016154f5565b6001600160a01b03161461082c5761080760608401604085016154f5565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a6060850185615510565b905090505f805b828163ffffffff161015610b22575f61085d6060880188615510565b8363ffffffff1681811061087357610873615555565b90506020028101906108859190615569565b61088e9061568d565b80516040519192505f9160088801916108a691615706565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf91906004016154cc565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f91615706565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d91906154de565b90508086600801835f01516040516109759190615706565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f76152d4565b021790555060208201516001820190610a10908261575b565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab591168561582a565b8251604051919550610ac691615706565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b9061583d565b9050610841565b50600483018190555f610b40610b3786611ddf565b60400151611ef5565b90505f610b4c87612082565b90505f600282604051610b5f9190615706565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d91906154de565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb8261225c565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c6152d4565b14610c4c578060405163170cc93360e21b81526004016104cf91906154be565b6106e58383612297565b5f610c6664e8d4a510008361585f565b92915050565b6106e5838383612511565b610c7f61270a565b5f80516020615e638339815191525f80610c9884612741565b91509150610ca58261225c565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce06152d4565b03610d05575f83815260078501602052604081208054919055610d038282612a7f565b505b610d1b81610d168460400151610fd9565b612af5565b505050505b610d3660015f80516020615ea383398151915255565b50565b5f610d4261270a565b610d4e85858585612b2b565b9050610d6660015f80516020615ea383398151915255565b949350505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115610dbb57610dbb6152d4565b6003811115610dcc57610dcc6152d4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e596152d4565b14610e7a578251604051633b0d540d60e21b81526104cf919060040161587e565b600481516005811115610e8f57610e8f6152d4565b03610ea557610e9d85612d04565b505050505050565b5f80610ebc610eb389611ddf565b60400151612eeb565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a51000615898565b5f610ffc826117af565b6080015192915050565b611011838383612511565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615e638339815191525f611049836117af565b5190506004816005811115611060576110606152d4565b14611080578060405163170cc93360e21b81526004016104cf91906154be565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a7f565b61110461270a565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115611151576111516152d4565b6003811115611162576111626152d4565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db6152d4565b146111fc578051604051633b0d540d60e21b81526104cf919060040161587e565b600461120b82604001516117af565b51600581111561121d5761121d6152d4565b146112af575f61122c85611ddf565b90505f8061123d8360400151612eeb565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612d04565b50506112d060015f80516020615ea383398151915255565b5050565b5f6112dd61270a565b6112e8833384613141565b9050610c6660015f80516020615ea383398151915255565b5f80516020615e838339815191525f8061132561131c85611ddf565b60400151613419565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f8281526006840160205260409020805461136590615486565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af6152d4565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b5f82815260068401602052604081206113fa9161505c565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff1660038111156114d6576114d66152d4565b60038111156114e7576114e76152d4565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611560576115606152d4565b14158015611581575060038151600381111561157e5761157e6152d4565b14155b156115a2578051604051633b0d540d60e21b81526104cf919060040161587e565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d90565b6040518263ffffffff1660e01b815260040161162b91906154cc565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b91906154de565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615e8383398151915291906116b990615486565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff166005811115611703576117036152d4565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016158af565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906154de565b6117b7615093565b5f8281525f80516020615ec3833981519152602052604090819020815160e0810190925280545f80516020615e83833981519152929190829060ff166005811115611804576118046152d4565b6005811115611815576118156152d4565b815260200160018201805461182990615486565b80601f016020809104026020016040519081016040528092919081815260200182805461185590615486565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561199084846135d5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615e83833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615939565b90815260200160405180910390205491505092915050565b5f8381525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e638339815191529284929091829060ff166003811115611a8657611a866152d4565b6003811115611a9757611a976152d4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b246152d4565b14611b45578251604051633b0d540d60e21b81526104cf919060040161587e565b60028401546080840151611b62916001600160401b031690615948565b6001600160401b0316421015611b965760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b60208301516001600160a01b03163314611c32575f8281526004850160205260409020546001600160a01b03163314611bcf57336110a1565b5f82815260048501602052604090205460a0820151611bfe91600160b01b90046001600160401b031690615948565b6001600160401b0316421015611c325760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b600281516005811115611c4757611c476152d4565b03611d24578615611c5e57611c5c8287612297565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c97918491611c929190615968565b6135ef565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611cd884613746565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d899350505050565b600481516005811115611d3957611d396152d4565b03611d6d57611d4783613746565b5f898152600686016020526040902055611d6088612d04565b6001945050505050611d89565b805160405163170cc93360e21b81526104cf91906004016154be565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e6a9190810190615993565b9150915080611e8c57604051636b2f19e960e01b815260040160405180910390fd5b815115611eb2578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611eee576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611f2a57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f7957611f41816001615a65565b611f4c906008615898565b61ffff16848281518110611f6257611f62615555565b016020015160f81c901b9190911790600101611f2d565b5061ffff811615611fa35760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611ffe57611fba816003615a65565b611fc5906008615898565b63ffffffff1685611fd783600261582a565b81518110611fe757611fe7615555565b016020015160f81c901b9190911790600101611fa6565b5063ffffffff81161561202457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120795761203b81601f615a65565b612046906008615898565b8661205283600661582a565b8151811061206257612062615555565b016020015160f81c901b9190911790600101612027565b50949350505050565b60605f8083356020850135601461209e878701604089016154f5565b6120ab6060890189615510565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121316060850185615510565b9050811015611eee57816121486060860186615510565b8381811061215857612158615555565b905060200281019061216a9190615569565b6121749080615a78565b90506121836060870187615510565b8481811061219357612193615555565b90506020028101906121a59190615569565b6121af9080615a78565b6121bc6060890189615510565b868181106121cc576121cc615555565b90506020028101906121de9190615569565b6121ec906020810190615a78565b6121f960608b018b615510565b8881811061220957612209615555565b905060200281019061221b9190615569565b61222c90606081019060400161529b565b6040516020016122429796959493929190615aba565b60408051601f198184030181529190529150600101612124565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122e2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123099190810190615993565b915091508061232b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561236e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061239291906154de565b8251146123b8578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123f4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f8061240384604001516138f2565b9150915081871461242a5760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615e63833981519152906001600160401b0390811690831611156124e7575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612506565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e638339815191528161252a86613ae3565b90506125358661225c565b61254457600192505050611d89565b5f8681526004830160205260409020546001600160a01b0316331461256957336110a1565b5f86815260048301602052604090205460a082015161259891600160b01b90046001600160401b031690615948565b6001600160401b03168160c001516001600160401b031610156125df5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125f7576125f08786612297565b9050612615565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061263a90610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156126b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d491906154de565b905080846007015f8a81526020019081526020015f205f8282546126f8919061582a565b90915550501515979650505050505050565b5f80516020615ea383398151915280546001190161273b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61274a615093565b5f80516020615e838339815191525f8061276661131c87611ddf565b91509150801561278d57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127be576127be6152d4565b60058111156127cf576127cf6152d4565b81526020016001820180546127e390615486565b80601f016020809104026020016040519081016040528092919081815260200182805461280f90615486565b801561285a5780601f106128315761010080835404028352916020019161285a565b820191905f5260205f20905b81548152906001019060200180831161283d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128c5576128c56152d4565b141580156128e657506001815160058111156128e3576128e36152d4565b14155b1561290757805160405163170cc93360e21b81526104cf91906004016154be565b60038151600581111561291c5761291c6152d4565b0361292a576004815261292f565b600581525b8360080181602001516040516129459190615706565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612989576129896152d4565b0217905550602082015160018201906129a2908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a4857612a486152d4565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e4383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ada575f80fd5b505af1158015612aec573d5f803e3d5ffd5b50505050505050565b5f80516020615e43833981519152546112d0906001600160a01b03168383613dc7565b60015f80516020615ea383398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e6383398151915290600160401b900461ffff9081169086161080612b7f575061271061ffff8616115b15612ba357604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612bdf576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612bf15750806001015483115b15612c125760405163222d164360e21b8152600481018490526024016104cf565b5f612c1c84613e26565b90505f612c2882610c56565b90505f612c358983613e49565b90506040518060800160405280612c493390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115612d5157612d516152d4565b6003811115612d6257612d626152d4565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e90575f84815260048701602052604090205461271090612e4290600160a01b900461ffff1685615898565b612e4c919061585f565b915081866007015f8681526020019081526020015f205f828254612e70919061582a565b90915550612e8090508284615a65565b9050612e90856020015182612a7f565b612ea58560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f2257835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f7157612f39816001615a65565b612f44906008615898565b61ffff16868281518110612f5a57612f5a615555565b016020015160f81c901b9190911790600101612f25565b5061ffff811615612f9b5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612ff657612fb2816003615a65565b612fbd906008615898565b63ffffffff1687612fcf83600261582a565b81518110612fdf57612fdf615555565b016020015160f81c901b9190911790600101612f9e565b5063ffffffff811660031461301e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130735761303581601f615a65565b613040906008615898565b8861304c83600661582a565b8151811061305c5761305c615555565b016020015160f81c901b9190911790600101613021565b505f805b60088110156130d25761308b816007615a65565b613096906008615898565b6001600160401b0316896130ab83602661582a565b815181106130bb576130bb615555565b016020015160f81c901b9190911790600101613077565b505f805b6008811015613131576130ea816007615a65565b6130f5906008615898565b6001600160401b03168a61310a83602e61582a565b8151811061311a5761311a615555565b016020015160f81c901b91909117906001016130d6565b5091989097509095509350505050565b5f5f80516020615e638339815191528161315d61028485613e26565b90505f613169876117af565b90506131748761225c565b613194576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156131a9576131a96152d4565b146131ca57805160405163170cc93360e21b81526104cf91906004016154be565b5f8282608001516131db9190615948565b905083600201600a9054906101000a90046001600160401b031682604001516132049190615b23565b6001600160401b0316816001600160401b0316111561324157604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f8061324d8a846135ef565b915091505f8a8360405160200161327b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561330e5761330e6152d4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461344f57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b600281101561349e57613466816001615a65565b613471906008615898565b61ffff1685828151811061348757613487615555565b016020015160f81c901b9190911790600101613452565b5061ffff8116156134c85760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613523576134df816003615a65565b6134ea906008615898565b63ffffffff16866134fc83600261582a565b8151811061350c5761350c615555565b016020015160f81c901b91909117906001016134cb565b5063ffffffff811660021461354b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135a05761356281601f615a65565b61356d906008615898565b8761357983600661582a565b8151811061358957613589615555565b016020015160f81c901b919091179060010161354e565b505f866026815181106135b5576135b5615555565b016020015191976001600160f81b03199092161515965090945050505050565b6135dd6143c1565b6135e68261440c565b6112d08161447a565b5f8281525f80516020615ec3833981519152602052604081206002015481905f80516020615e8383398151915290600160801b90046001600160401b031661363785826144e2565b5f613641876146bc565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136918a858b611d90565b6040518263ffffffff1660e01b81526004016136ad91906154cc565b6020604051808303815f875af11580156136c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136ed91906154de565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e6383398151915290505f61376684604001516117af565b90505f60038251600581111561377e5761377e6152d4565b148061379c575060048251600581111561379a5761379a6152d4565b145b156137ac575060c08101516137e9565b6002825160058111156137c1576137c16152d4565b036137cd5750426137e9565b815160405163170cc93360e21b81526104cf91906004016154be565b84608001516001600160401b0316816001600160401b03161161381057505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061383590610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156138c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138e991906154de565b95945050505050565b5f808251602e1461392857825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b60028110156139775761393f816001615a65565b61394a906008615898565b61ffff1685828151811061396057613960615555565b016020015160f81c901b919091179060010161392b565b5061ffff8116156139a15760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139fc576139b8816003615a65565b6139c3906008615898565b63ffffffff16866139d583600261582a565b815181106139e5576139e5615555565b016020015160f81c901b91909117906001016139a4565b5063ffffffff811615613a2257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a7757613a3981601f615a65565b613a44906008615898565b87613a5083600661582a565b81518110613a6057613a60615555565b016020015160f81c901b9190911790600101613a25565b505f805b6008811015613ad657613a8f816007615a65565b613a9a906008615898565b6001600160401b031688613aaf83602661582a565b81518110613abf57613abf615555565b016020015160f81c901b9190911790600101613a7b565b5090969095509350505050565b613aeb615093565b5f8281525f80516020615ec38339815191526020526040808220815160e0810190925280545f80516020615e8383398151915293929190829060ff166005811115613b3857613b386152d4565b6005811115613b4957613b496152d4565b8152602001600182018054613b5d90615486565b80601f0160208091040260200160405190810160405280929190818152602001828054613b8990615486565b8015613bd45780601f10613bab57610100808354040283529160200191613bd4565b820191905f5260205f20905b815481529060010190602001808311613bb757829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c4257613c426152d4565b14613c75575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cb957613cb96152d4565b021790555060208201516001820190613cd2908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d7085826135ef565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614731565b5f610c66825f80516020615e43833981519152546001600160a01b031690614792565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e8d57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615e8383398151915242613eac606086016040870161529b565b6001600160401b0316111580613ee65750613eca6202a3004261582a565b613eda606086016040870161529b565b6001600160401b031610155b15613f2057613efb606085016040860161529b565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613f35613f306060860186615b4e565b6148eb565b613f45613f306080860186615b4e565b6030613f546020860186615a78565b905014613f8657613f686020850185615a78565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f908480615a78565b90505f03613fbd57613fa28480615a78565b604051633e08a12560e11b81526004016104cf929190615b62565b5f60088201613fcc8680615a78565b604051613fda929190615939565b9081526020016040518091039020541461401357613ff88480615a78565b60405163a41f772f60e01b81526004016104cf929190615b62565b61401d835f6144e2565b6040805160e08101909152815481525f90819061412990602081016140428980615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061408a908a018a615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140d360608a0160408b0161529b565b6001600160401b031681526020016140ee60608a018a615b4e565b6140f790615b90565b815260200161410960808a018a615b4e565b61411290615b90565b8152602001876001600160401b0316815250614a54565b5f82815260068601602052604090209193509150614147828261575b565b5081600884016141578880615a78565b604051614165929190615939565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141a19085906004016154cc565b6020604051808303815f875af11580156141bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141e191906154de565b6040805160e0810190915290915080600181526020016142018980615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115614290576142906152d4565b0217905550602082015160018201906142a9908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143478880615a78565b604051614355929190615939565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614393919061529b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661440a57604051631afcd79f60e31b815260040160405180910390fd5b565b6144146143c1565b61441d81614c41565b614425614c5a565b610d366060820135608083013561444260c0850160a0860161529b565b61445260e0860160c08701615c57565b614463610100870160e08801615c70565b614475610120880161010089016154f5565b614c6a565b6144826143c1565b5f80516020615e438339815191526001600160a01b0382166144c257604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615e838339815191525f6001600160401b0380841690851611156145165761450f8385615968565b9050614523565b6145208484615968565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614585575060018401548151614581916001600160401b03169061582a565b8210155b156145ab576001600160401b0383166060820152818152604081015160208201526145ca565b82816060018181516145bd9190615948565b6001600160401b03169052505b60608101516145da906064615b23565b602082015160018601546001600160401b0392909216916146059190600160401b900460ff16615898565b101561463557606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b031681604001818151614650919061582a565b9052506040810180516001600160401b0387169190614670908390615a65565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615ec38339815191526020526040812060020180545f80516020615e83833981519152919060089061470690600160401b90046001600160401b0316615c90565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147456001600160a01b03841683614e00565b905080515f141580156147695750808060200190518101906147679190615cab565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156147d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147fc91906154de565b90506148136001600160a01b038516333086614e0d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614857573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061487b91906154de565b90508181116148e15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b6138e98282615a65565b6148f860208201826151ce565b63ffffffff1615801561491857506149136020820182615510565b151590505b1561495f5761492a60208201826151ce565b6149376020830183615510565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b61496c6020820182615510565b905061497b60208301836151ce565b63ffffffff1611156149945761492a60208201826151ce565b60015b6149a46020830183615510565b90508110156112d0576149ba6020830183615510565b6149c5600184615a65565b8181106149d4576149d4615555565b90506020020160208101906149e991906154f5565b6001600160a01b03166149ff6020840184615510565b83818110614a0f57614a0f615555565b9050602002016020810190614a2491906154f5565b6001600160a01b03161015614a4c57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614997565b5f6060826040015151603014614a7d5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614abe988a986001989297929690959094909390929101615cc6565b60405160208183030381529060405290505f5b84608001516020015151811015614b3057818560800151602001518281518110614afd57614afd615555565b6020026020010151604051602001614b16929190615d80565b60408051601f198184030181529190529150600101614ad1565b5060a0840151805160209182015151604051614b50938593929101615db6565b60405160208183030381529060405290505f5b8460a001516020015151811015614bc257818560a00151602001518281518110614b8f57614b8f615555565b6020026020010151604051602001614ba8929190615d80565b60408051601f198184030181529190529150600101614b63565b5060c0840151604051614bd9918391602001615df1565b6040516020818303038152906040529050600281604051614bfa9190615706565b602060405180830381855afa158015614c15573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c3891906154de565b94909350915050565b614c496143c1565b614c51614e46565b610d3681614e4e565b614c626143c1565b61440a614f36565b614c726143c1565b5f80516020615e6383398151915261ffff84161580614c96575061271061ffff8516115b15614cba57604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614cde5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614cf15750600a60ff8416115b15614d145760405163170db35960e31b815260ff841660048201526024016104cf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316856001600160401b03161015614d7b576040516202a06d60e11b81526001600160401b03861660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d8983835f614f3e565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613df4565b61440a6143c1565b614e566143c1565b80355f80516020615e838339815191529081556014614e7b6060840160408501615c70565b60ff161180614e9a5750614e956060830160408401615c70565b60ff16155b15614ece57614eaf6060830160408401615c70565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614ede6060830160408401615c70565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f0f604083016020840161529b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b186143c1565b606081471015614f635760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614f7e9190615706565b5f6040518083038185875af1925050503d805f8114614fb8576040519150601f19603f3d011682016040523d82523d5f602084013e614fbd565b606091505b5091509150614fcd868383614fd7565b9695505050505050565b606082614fec57614fe782615033565b611d89565b815115801561500357506001600160a01b0384163b155b1561502c57604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d89565b8051156150435780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461506890615486565b5f825580601f10615077575050565b601f0160209004905f5260205f2090810190610d3691906150d0565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156150e4575f81556001016150d1565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114615108575f80fd5b919050565b5f805f6060848603121561511f575f80fd5b833592506020840135615131816150e8565b915061513f604085016150f5565b90509250925092565b5f60208284031215615158575f80fd5b5035919050565b5f8060408385031215615170575f80fd5b82356001600160401b03811115615185575f80fd5b830160808186031215615196575f80fd5b91506151a4602084016150f5565b90509250929050565b5f80604083850312156151be575f80fd5b823591506151a4602084016150f5565b5f602082840312156151de575f80fd5b611d89826150f5565b803561ffff81168114615108575f80fd5b80356001600160401b0381168114615108575f80fd5b5f805f8060808587031215615221575f80fd5b84356001600160401b03811115615236575f80fd5b850160a08188031215615247575f80fd5b9350615255602086016151e7565b9250615263604086016151f8565b9396929550929360600135925050565b5f8060408385031215615284575f80fd5b61528d836150f5565b946020939093013593505050565b5f602082840312156152ab575f80fd5b611d89826151f8565b5f80604083850312156152c5575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106152f8576152f86152d4565b9052565b5f5b838110156153165781810151838201526020016152fe565b50505f910152565b5f81518084526153358160208601602086016152fc565b601f01601f19169290920160200192915050565b6020815261535b6020820183516152e8565b5f602083015160e0604084015261537661010084018261531e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f808284036101408112156153f0575f80fd5b610120808212156153ff575f80fd5b8493508301359050615410816153c9565b809150509250929050565b5f806020838503121561542c575f80fd5b82356001600160401b0380821115615442575f80fd5b818501915085601f830112615455575f80fd5b813581811115615463575f80fd5b866020828501011115615474575f80fd5b60209290920196919550909350505050565b600181811c9082168061549a57607f821691505b6020821081036154b857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c6682846152e8565b602081525f611d89602083018461531e565b5f602082840312156154ee575f80fd5b5051919050565b5f60208284031215615505575f80fd5b8135611d89816153c9565b5f808335601e19843603018112615525575f80fd5b8301803591506001600160401b0382111561553e575f80fd5b6020019150600581901b360382131561373f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261557d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155bd576155bd615587565b60405290565b604080519081016001600160401b03811182821017156155bd576155bd615587565b604051601f8201601f191681016001600160401b038111828210171561560d5761560d615587565b604052919050565b5f6001600160401b0382111561562d5761562d615587565b50601f01601f191660200190565b5f82601f83011261564a575f80fd5b813561565d61565882615615565b6155e5565b818152846020838601011115615671575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561569d575f80fd5b6156a561559b565b82356001600160401b03808211156156bb575f80fd5b6156c73683870161563b565b835260208501359150808211156156dc575f80fd5b506156e93682860161563b565b6020830152506156fb604084016151f8565b604082015292915050565b5f825161557d8184602087016152fc565b601f8211156104d857805f5260205f20601f840160051c8101602085101561573c5750805b601f840160051c820191505b8181101561166b575f8155600101615748565b81516001600160401b0381111561577457615774615587565b615788816157828454615486565b84615717565b602080601f8311600181146157bb575f84156157a45750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b828110156157e9578886015182559484019460019091019084016157ca565b508582101561580657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c66615816565b5f63ffffffff80831681810361585557615855615816565b6001019392505050565b5f8261587957634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615892576158926152d4565b91905290565b8082028115828204841417610c6657610c66615816565b5f60208083525f84546158c181615486565b806020870152604060018084165f81146158e257600181146158fe5761592b565b60ff19851660408a0152604084151560051b8a0101955061592b565b895f5260205f205f5b858110156159225781548b8201860152908301908801615907565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611eee57611eee615816565b6001600160401b03828116828216039080821115611eee57611eee615816565b8051615108816150e8565b5f80604083850312156159a4575f80fd5b82516001600160401b03808211156159ba575f80fd5b90840190606082870312156159cd575f80fd5b6159d561559b565b825181526020808401516159e8816153c9565b828201526040840151838111156159fd575f80fd5b80850194505087601f850112615a11575f80fd5b83519250615a2161565884615615565b8381528882858701011115615a34575f80fd5b615a43848383018488016152fc565b80604084015250819550615a58818801615988565b9450505050509250929050565b81810381811115610c6657610c66615816565b5f808335601e19843603018112615a8d575f80fd5b8301803591506001600160401b03821115615aa6575f80fd5b60200191503681900382131561373f575f80fd5b5f8851615acb818460208d016152fc565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b4657615b46615816565b505092915050565b5f8235603e1983360301811261557d575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ba0575f80fd5b615ba86155c3565b615bb1836150f5565b81526020808401356001600160401b0380821115615bcd575f80fd5b9085019036601f830112615bdf575f80fd5b813581811115615bf157615bf1615587565b8060051b9150615c028483016155e5565b8181529183018401918481019036841115615c1b575f80fd5b938501935b83851015615c455784359250615c35836153c9565b8282529385019390850190615c20565b94860194909452509295945050505050565b5f60208284031215615c67575f80fd5b611d89826151e7565b5f60208284031215615c80575f80fd5b813560ff81168114611d89575f80fd5b5f6001600160401b0380831681810361585557615855615816565b5f60208284031215615cbb575f80fd5b8151611d89816150e8565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d0c81602a850160208b016152fc565b865190830190615d2381602a840160208b016152fc565b60c087901b6001600160c01b031916602a9290910191820152615d55603282018660e01b6001600160e01b0319169052565b615d6e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615d918184602088016152fc565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615dc78184602089016152fc565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e028184602088016152fc565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 9bff585a9..9dca454c5 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -91,7 +91,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615c96380380615c9683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b498061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614e00565b61060a565b005b348015610216575f80fd5b50610209610225366004614e3b565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614e00565b61084d565b34801561027f575f80fd5b5061020961028e366004614e52565b610858565b34801561029e575f80fd5b506102096102ad366004614ea0565b610d44565b3480156102bd575f80fd5b506102096102cc366004614eb7565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614e3b565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614e00565b610eab565b34801561038c575f80fd5b5061020961039b366004614ed8565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614ef1565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614f2f565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614e3b565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614e00565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614e3b565b61123b565b3480156104a4575f80fd5b506102096104b3366004614ef1565b611306565b3480156104c3575f80fd5b506102096104d2366004614ed8565b6114de565b6104076104e5366004614f59565b611667565b3480156104f5575f80fd5b506104075f80516020615abd83398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614e3b565b61169b565b34801561054e575f80fd5b506104075f80516020615add83398151915281565b34801561056e575f80fd5b5061020961057d366004614e3b565b611884565b610407610590366004614e3b565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614e3b565b6119f2565b60405161024c9190615022565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b506104076106053660046150a2565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff16600581111561068c5761068c614fad565b600581111561069d5761069d614fad565b81526020016001820180546106b19061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061510d565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614fad565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611ea3565b6040518263ffffffff1660e01b8152600401610807919061514d565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610847919061515f565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615add8339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610911919061515f565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161518a565b6001600160a01b03161461098e57610969606084016040850161518a565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c60608501856151a5565b905090505f805b828163ffffffff161015610c84575f6109bf60608801886151a5565b8363ffffffff168181106109d5576109d56151ea565b90506020028101906109e791906151fe565b6109f090615322565b80516040519192505f916008880191610a089161539b565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b8152610631919060040161514d565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a819161539b565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf919061515f565b90508086600801835f0151604051610ad7919061539b565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614fad565b021790555060208201516001820190610b7290826153f0565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c179116856154bf565b8251604051919550610c289161539b565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d906154d2565b90506109a3565b50600483018190555f610ca2610c9986611ef2565b60400151612008565b90505f610cae87612195565b90505f600282604051610cc1919061539b565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff919061515f565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd58361236f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a82612380565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614fad565b14610e8b578060405163170cc93360e21b8152600401610631919061513f565b61084783836123bb565b5f610ea564e8d4a51000836154f4565b92915050565b610847838383612635565b610ebe61282e565b5f80516020615abd8339815191525f80610ed784612865565b91509150610ee482612380565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614fad565b03610f44575f83815260078501602052604081208054919055610f428282612ba3565b505b610f5a81610f5584604001516111e3565b612c01565b505050505b610f7560015f80516020615afd83398151915255565b50565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115610fc557610fc5614fad565b6003811115610fd657610fd6614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614fad565b14611084578251604051633b0d540d60e21b81526106319190600401615513565b60048151600581111561109957611099614fad565b036110af576110a785612c27565b505050505050565b5f806110c66110bd89611ef2565b60400151612e0e565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a5100061552d565b5f611206826119f2565b6080015192915050565b61121b838383612635565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615abd8339815191525f611253836119f2565b519050600481600581111561126a5761126a614fad565b1461128a578060405163170cc93360e21b8152600401610631919061513f565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612ba3565b61130e61282e565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff16600381111561135b5761135b614fad565b600381111561136c5761136c614fad565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614fad565b14611406578051604051633b0d540d60e21b81526106319190600401615513565b600461141582604001516119f2565b51600581111561142757611427614fad565b146114b9575f61143685611ef2565b90505f806114478360400151612e0e565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c27565b50506114da60015f80516020615afd83398151915255565b5050565b5f80516020615add8339815191525f806115036114fa85611ef2565b60400151613064565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f828152600684016020526040902080546115439061510d565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614fad565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068401602052604081206115d891614d54565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61167061282e565b61167c84848434613220565b905061169460015f80516020615afd83398151915255565b9392505050565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff1660038111156116e8576116e8614fad565b60038111156116f9576116f9614fad565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614fad565b14158015611793575060038151600381111561179057611790614fad565b14155b156117b4578051604051633b0d540d60e21b81526106319190600401615513565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611ea3565b6040518263ffffffff1660e01b815260040161183d919061514d565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d919061515f565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615add83398151915291906118cb9061510d565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614fad565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119819190600401615544565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a919061515f565b5f6119ca61282e565b6119d58233346133ee565b90506119ed60015f80516020615afd83398151915255565b919050565b6119fa614d8b565b5f8281525f80516020615b1d833981519152602052604090819020815160e0810190925280545f80516020615add833981519152929190829060ff166005811115611a4757611a47614fad565b6005811115611a5857611a58614fad565b8152602001600182018054611a6c9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a989061510d565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615add833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8490869086906155ce565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd8339815191529284929091829060ff166003811115611bea57611bea614fad565b6003811115611bfb57611bfb614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614fad565b14611ca9578251604051633b0d540d60e21b81526106319190600401615513565b60208301516001600160a01b03163314611d4c575f828152600485016020526040902054336001600160a01b0390911603611d46575f82815260048501602052604090205460a0820151611d0d91600160b01b90046001600160401b0316906155dd565b6001600160401b0316421015611d415760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b611d4c565b336112ab565b600281516005811115611d6157611d61614fad565b03611e3e578615611d7857611d7682876123bb565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611db1918491611dac91906155fd565b6136c3565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611df28461381a565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e5357611e53614fad565b03611e8757611e618361381a565b5f898152600686016020526040902055611e7a88612c27565b6001945050505050611694565b805160405163170cc93360e21b8152610631919060040161513f565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f56573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7d9190810190615628565b9150915080611f9f57604051636b2f19e960e01b815260040160405180910390fd5b815115611fc5578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612001576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461203d57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561208c576120548160016156fa565b61205f90600861552d565b61ffff16848281518110612075576120756151ea565b016020015160f81c901b9190911790600101612040565b5061ffff8116156120b65760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612111576120cd8160036156fa565b6120d890600861552d565b63ffffffff16856120ea8360026154bf565b815181106120fa576120fa6151ea565b016020015160f81c901b91909117906001016120b9565b5063ffffffff81161561213757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561218c5761214e81601f6156fa565b61215990600861552d565b866121658360066154bf565b81518110612175576121756151ea565b016020015160f81c901b919091179060010161213a565b50949350505050565b60605f808335602085013560146121b18787016040890161518a565b6121be60608901896151a5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61224460608501856151a5565b9050811015612001578161225b60608601866151a5565b8381811061226b5761226b6151ea565b905060200281019061227d91906151fe565b612287908061570d565b905061229660608701876151a5565b848181106122a6576122a66151ea565b90506020028101906122b891906151fe565b6122c2908061570d565b6122cf60608901896151a5565b868181106122df576122df6151ea565b90506020028101906122f191906151fe565b6122ff90602081019061570d565b61230c60608b018b6151a5565b8881811061231c5761231c6151ea565b905060200281019061232e91906151fe565b61233f906060810190604001614f2f565b604051602001612355979695949392919061574f565b60408051601f198184030181529190529150600101612237565b6123776139c6565b610f7581613a11565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612406573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261242d9190810190615628565b915091508061244f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b6919061515f565b8251146124dc578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612518576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125278460400151613a7f565b9150915081871461254e5760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615abd833981519152906001600160401b03908116908316111561260b575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261262a565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615abd8339815191528161264e86613c70565b905061265986612380565b61266857600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461268d57336112ab565b5f86815260048301602052604090205460a08201516126bc91600160b01b90046001600160401b0316906155dd565b6001600160401b03168160c001516001600160401b031610156127035760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f851561271b5761271487866123bb565b9050612739565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061275e906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156127d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f8919061515f565b905080846007015f8a81526020019081526020015f205f82825461281c91906154bf565b90915550501515979650505050505050565b5f80516020615afd83398151915280546001190161285f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61286e614d8b565b5f80516020615add8339815191525f8061288a6114fa87611ef2565b9150915080156128b157604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128e2576128e2614fad565b60058111156128f3576128f3614fad565b81526020016001820180546129079061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546129339061510d565b801561297e5780601f106129555761010080835404028352916020019161297e565b820191905f5260205f20905b81548152906001019060200180831161296157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129e9576129e9614fad565b14158015612a0a5750600181516005811115612a0757612a07614fad565b14155b15612a2b57805160405163170cc93360e21b8152610631919060040161513f565b600381516005811115612a4057612a40614fad565b03612a4e5760048152612a53565b600581525b836008018160200151604051612a69919061539b565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aad57612aad614fad565b021790555060208201516001820190612ac690826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b6c57612b6c614fad565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612bef575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f54565b60015f80516020615afd83398151915255565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115612c7457612c74614fad565b6003811115612c8557612c85614fad565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612db3575f84815260048701602052604090205461271090612d6590600160a01b900461ffff168561552d565b612d6f91906154f4565b915081866007015f8681526020019081526020015f205f828254612d9391906154bf565b90915550612da3905082846156fa565b9050612db3856020015182612ba3565b612dc88560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4557835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e9457612e5c8160016156fa565b612e6790600861552d565b61ffff16868281518110612e7d57612e7d6151ea565b016020015160f81c901b9190911790600101612e48565b5061ffff811615612ebe5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f1957612ed58160036156fa565b612ee090600861552d565b63ffffffff1687612ef28360026154bf565b81518110612f0257612f026151ea565b016020015160f81c901b9190911790600101612ec1565b5063ffffffff8116600314612f4157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f9657612f5881601f6156fa565b612f6390600861552d565b88612f6f8360066154bf565b81518110612f7f57612f7f6151ea565b016020015160f81c901b9190911790600101612f44565b505f805b6008811015612ff557612fae8160076156fa565b612fb990600861552d565b6001600160401b031689612fce8360266154bf565b81518110612fde57612fde6151ea565b016020015160f81c901b9190911790600101612f9a565b505f805b60088110156130545761300d8160076156fa565b61301890600861552d565b6001600160401b03168a61302d83602e6154bf565b8151811061303d5761303d6151ea565b016020015160f81c901b9190911790600101612ff9565b5091989097509095509350505050565b5f80825160271461309a57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b60028110156130e9576130b18160016156fa565b6130bc90600861552d565b61ffff168582815181106130d2576130d26151ea565b016020015160f81c901b919091179060010161309d565b5061ffff8116156131135760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561316e5761312a8160036156fa565b61313590600861552d565b63ffffffff16866131478360026154bf565b81518110613157576131576151ea565b016020015160f81c901b9190911790600101613116565b5063ffffffff811660021461319657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131eb576131ad81601f6156fa565b6131b890600861552d565b876131c48360066154bf565b815181106131d4576131d46151ea565b016020015160f81c901b9190911790600101613199565b505f86602681518110613200576132006151ea565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615abd83398151915290600160401b900461ffff9081169086161080613274575061271061ffff8616115b1561329857604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b0390811690851610156132d4576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806132e65750806001015483115b156133075760405163222d164360e21b815260048101849052602401610631565b825f61331282610e95565b90505f61331f8983613fe7565b905060405180608001604052806133333390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615abd8339815191528161340784610e95565b90505f613413876119f2565b905061341e87612380565b61343e576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561345357613453614fad565b1461347457805160405163170cc93360e21b8152610631919060040161513f565b5f82826080015161348591906155dd565b905083600201600a9054906101000a90046001600160401b031682604001516134ae91906157b8565b6001600160401b0316816001600160401b031611156134eb57604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806134f78a846136c3565b915091505f8a8360405160200161352592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135b8576135b8614fad565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615b1d833981519152602052604081206002015481905f80516020615add83398151915290600160801b90046001600160401b031661370b858261455f565b5f61371587614739565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137658a858b611ea3565b6040518263ffffffff1660e01b8152600401613781919061514d565b6020604051808303815f875af115801561379d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c1919061515f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615abd83398151915290505f61383a84604001516119f2565b90505f60038251600581111561385257613852614fad565b1480613870575060048251600581111561386e5761386e614fad565b145b15613880575060c08101516138bd565b60028251600581111561389557613895614fad565b036138a15750426138bd565b815160405163170cc93360e21b8152610631919060040161513f565b84608001516001600160401b0316816001600160401b0316116138e457505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613909906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139bd919061515f565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a0f57604051631afcd79f60e31b815260040160405180910390fd5b565b613a196139c6565b613a22816147ae565b613a2a6147c7565b610f7560608201356080830135613a4760c0850160a08601614f2f565b613a5760e0860160c087016157e3565b613a68610100870160e088016157fc565b613a7a6101208801610100890161518a565b6147d7565b5f808251602e14613ab557825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b0457613acc8160016156fa565b613ad790600861552d565b61ffff16858281518110613aed57613aed6151ea565b016020015160f81c901b9190911790600101613ab8565b5061ffff811615613b2e5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b8957613b458160036156fa565b613b5090600861552d565b63ffffffff1686613b628360026154bf565b81518110613b7257613b726151ea565b016020015160f81c901b9190911790600101613b31565b5063ffffffff811615613baf57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c0457613bc681601f6156fa565b613bd190600861552d565b87613bdd8360066154bf565b81518110613bed57613bed6151ea565b016020015160f81c901b9190911790600101613bb2565b505f805b6008811015613c6357613c1c8160076156fa565b613c2790600861552d565b6001600160401b031688613c3c8360266154bf565b81518110613c4c57613c4c6151ea565b016020015160f81c901b9190911790600101613c08565b5090969095509350505050565b613c78614d8b565b5f8281525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff166005811115613cc557613cc5614fad565b6005811115613cd657613cd6614fad565b8152602001600182018054613cea9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054613d169061510d565b8015613d615780601f10613d3857610100808354040283529160200191613d61565b820191905f5260205f20905b815481529060010190602001808311613d4457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dcf57613dcf614fad565b14613e02575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e4657613e46614fad565b021790555060208201516001820190613e5f90826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613efd85826136c3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f775760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fc0576040519150601f19603f3d011682016040523d82523d5f602084013e613fc5565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661402b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615add8339815191524261404a6060860160408701614f2f565b6001600160401b031611158061408457506140686202a300426154bf565b6140786060860160408701614f2f565b6001600160401b031610155b156140be576140996060850160408601614f2f565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b6140d36140ce606086018661581c565b614906565b6140e36140ce608086018661581c565b60306140f2602086018661570d565b90501461412457614106602085018561570d565b6040516326475b2f60e11b8152610631925060040190815260200190565b61412e848061570d565b90505f0361415b57614140848061570d565b604051633e08a12560e11b8152600401610631929190615830565b5f6008820161416a868061570d565b6040516141789291906155ce565b908152602001604051809103902054146141b157614196848061570d565b60405163a41f772f60e01b8152600401610631929190615830565b6141bb835f61455f565b6040805160e08101909152815481525f9081906142c790602081016141e0898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614228908a018a61570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161427160608a0160408b01614f2f565b6001600160401b0316815260200161428c60608a018a61581c565b6142959061585e565b81526020016142a760808a018a61581c565b6142b09061585e565b8152602001876001600160401b0316815250614a6f565b5f828152600686016020526040902091935091506142e582826153f0565b5081600884016142f5888061570d565b6040516143039291906155ce565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061433f90859060040161514d565b6020604051808303815f875af115801561435b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437f919061515f565b6040805160e08101909152909150806001815260200161439f898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561442e5761442e614fad565b02179055506020820151600182019061444790826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144e5888061570d565b6040516144f39291906155ce565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145319190614f2f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615add8339815191525f6001600160401b0380841690851611156145935761458c83856155fd565b90506145a0565b61459d84846155fd565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146025750600184015481516145fe916001600160401b0316906154bf565b8210155b15614628576001600160401b038316606082015281815260408101516020820152614647565b828160600181815161463a91906155dd565b6001600160401b03169052505b60608101516146579060646157b8565b602082015160018601546001600160401b0392909216916146829190600160401b900460ff1661552d565b10156146b257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146cd91906154bf565b9052506040810180516001600160401b03871691906146ed9083906156fa565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615b1d8339815191526020526040812060020180545f80516020615add833981519152919060089061478390600160401b90046001600160401b0316615925565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147b66139c6565b6147be614c5c565b610f7581614c64565b6147cf6139c6565b613a0f614d4c565b6147df6139c6565b5f80516020615abd83398151915261ffff84161580614803575061271061ffff8516115b1561482757604051635f12e6c360e11b815261ffff85166004820152602401610631565b8587111561484b5760405163222d164360e21b815260048101889052602401610631565b60ff8316158061485e5750600a60ff8416115b156148815760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6149136020820182614ed8565b63ffffffff16158015614933575061492e60208201826151a5565b151590505b1561497a576149456020820182614ed8565b61495260208301836151a5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b61498760208201826151a5565b90506149966020830183614ed8565b63ffffffff1611156149af576149456020820182614ed8565b60015b6149bf60208301836151a5565b90508110156114da576149d560208301836151a5565b6149e06001846156fa565b8181106149ef576149ef6151ea565b9050602002016020810190614a04919061518a565b6001600160a01b0316614a1a60208401846151a5565b83818110614a2a57614a2a6151ea565b9050602002016020810190614a3f919061518a565b6001600160a01b03161015614a6757604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149b2565b5f6060826040015151603014614a985760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614ad9988a986001989297929690959094909390929101615940565b60405160208183030381529060405290505f5b84608001516020015151811015614b4b57818560800151602001518281518110614b1857614b186151ea565b6020026020010151604051602001614b319291906159fa565b60408051601f198184030181529190529150600101614aec565b5060a0840151805160209182015151604051614b6b938593929101615a30565b60405160208183030381529060405290505f5b8460a001516020015151811015614bdd57818560a00151602001518281518110614baa57614baa6151ea565b6020026020010151604051602001614bc39291906159fa565b60408051601f198184030181529190529150600101614b7e565b5060c0840151604051614bf4918391602001615a6b565b6040516020818303038152906040529050600281604051614c15919061539b565b602060405180830381855afa158015614c30573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c53919061515f565b94909350915050565b613a0f6139c6565b614c6c6139c6565b80355f80516020615add8339815191529081556014614c9160608401604085016157fc565b60ff161180614cb05750614cab60608301604084016157fc565b60ff16155b15614ce457614cc560608301604084016157fc565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614cf460608301604084016157fc565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d256040830160208401614f2f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c146139c6565b508054614d609061510d565b5f825580601f10614d6f575050565b601f0160209004905f5260205f2090810190610f759190614dc8565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ddc575f8155600101614dc9565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614e12575f80fd5b833592506020840135614e2481614de0565b9150614e3260408501614ded565b90509250925092565b5f60208284031215614e4b575f80fd5b5035919050565b5f8060408385031215614e63575f80fd5b82356001600160401b03811115614e78575f80fd5b830160808186031215614e89575f80fd5b9150614e9760208401614ded565b90509250929050565b5f6101208284031215614eb1575f80fd5b50919050565b5f8060408385031215614ec8575f80fd5b82359150614e9760208401614ded565b5f60208284031215614ee8575f80fd5b61169482614ded565b5f8060408385031215614f02575f80fd5b614f0b83614ded565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614f3f575f80fd5b61169482614f19565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614f6b575f80fd5b83356001600160401b03811115614f80575f80fd5b840160a08187031215614f91575f80fd5b9250614f9f60208501614f48565b9150614e3260408501614f19565b634e487b7160e01b5f52602160045260245ffd5b60068110614fd157614fd1614fad565b9052565b5f5b83811015614fef578181015183820152602001614fd7565b50505f910152565b5f815180845261500e816020860160208601614fd5565b601f01601f19169290920160200192915050565b60208152615034602082018351614fc1565b5f602083015160e0604084015261504f610100840182614ff7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150b3575f80fd5b82356001600160401b03808211156150c9575f80fd5b818501915085601f8301126150dc575f80fd5b8135818111156150ea575f80fd5b8660208285010111156150fb575f80fd5b60209290920196919550909350505050565b600181811c9082168061512157607f821691505b602082108103614eb157634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614fc1565b602081525f6116946020830184614ff7565b5f6020828403121561516f575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561519a575f80fd5b813561169481615176565b5f808335601e198436030181126151ba575f80fd5b8301803591506001600160401b038211156151d3575f80fd5b6020019150600581901b3603821315613813575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615212575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152525761525261521c565b60405290565b604080519081016001600160401b03811182821017156152525761525261521c565b604051601f8201601f191681016001600160401b03811182821017156152a2576152a261521c565b604052919050565b5f6001600160401b038211156152c2576152c261521c565b50601f01601f191660200190565b5f82601f8301126152df575f80fd5b81356152f26152ed826152aa565b61527a565b818152846020838601011115615306575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615332575f80fd5b61533a615230565b82356001600160401b0380821115615350575f80fd5b61535c368387016152d0565b83526020850135915080821115615371575f80fd5b5061537e368286016152d0565b60208301525061539060408401614f19565b604082015292915050565b5f8251615212818460208701614fd5565b601f82111561063a57805f5260205f20601f840160051c810160208510156153d15750805b601f840160051c820191505b8181101561187d575f81556001016153dd565b81516001600160401b038111156154095761540961521c565b61541d81615417845461510d565b846153ac565b602080601f831160018114615450575f84156154395750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561547e5788860151825594840194600190910190840161545f565b508582101561549b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea56154ab565b5f63ffffffff8083168181036154ea576154ea6154ab565b6001019392505050565b5f8261550e57634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061552757615527614fad565b91905290565b8082028115828204841417610ea557610ea56154ab565b5f60208083525f84546155568161510d565b806020870152604060018084165f81146155775760018114615593576155c0565b60ff19851660408a0152604084151560051b8a010195506155c0565b895f5260205f205f5b858110156155b75781548b820186015290830190880161559c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115612001576120016154ab565b6001600160401b03828116828216039080821115612001576120016154ab565b80516119ed81614de0565b5f8060408385031215615639575f80fd5b82516001600160401b038082111561564f575f80fd5b9084019060608287031215615662575f80fd5b61566a615230565b8251815260208084015161567d81615176565b82820152604084015183811115615692575f80fd5b80850194505087601f8501126156a6575f80fd5b835192506156b66152ed846152aa565b83815288828587010111156156c9575f80fd5b6156d884838301848801614fd5565b806040840152508195506156ed81880161561d565b9450505050509250929050565b81810381811115610ea557610ea56154ab565b5f808335601e19843603018112615722575f80fd5b8301803591506001600160401b0382111561573b575f80fd5b602001915036819003821315613813575f80fd5b5f8851615760818460208d01614fd5565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146157db576157db6154ab565b505092915050565b5f602082840312156157f3575f80fd5b61169482614f48565b5f6020828403121561580c575f80fd5b813560ff81168114611694575f80fd5b5f8235603e19833603018112615212575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6040823603121561586e575f80fd5b615876615258565b61587f83614ded565b81526020808401356001600160401b038082111561589b575f80fd5b9085019036601f8301126158ad575f80fd5b8135818111156158bf576158bf61521c565b8060051b91506158d084830161527a565b81815291830184019184810190368411156158e9575f80fd5b938501935b83851015615913578435925061590383615176565b82825293850193908501906158ee565b94860194909452509295945050505050565b5f6001600160401b038083168181036154ea576154ea6154ab565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161598681602a850160208b01614fd5565b86519083019061599d81602a840160208b01614fd5565b60c087901b6001600160c01b031916602a92909101918201526159cf603282018660e01b6001600160e01b0319169052565b6159e8603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a0b818460208801614fd5565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615a41818460208901614fd5565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615a7c818460208801614fd5565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d47380380615d4783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615bfa8061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614eb1565b61060a565b005b348015610216575f80fd5b50610209610225366004614eec565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614eb1565b61084d565b34801561027f575f80fd5b5061020961028e366004614f03565b610858565b34801561029e575f80fd5b506102096102ad366004614f51565b610d44565b3480156102bd575f80fd5b506102096102cc366004614f68565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614eec565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614eb1565b610eab565b34801561038c575f80fd5b5061020961039b366004614f89565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614fa2565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614fe0565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614eec565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614eb1565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614eec565b61123b565b3480156104a4575f80fd5b506102096104b3366004614fa2565b611306565b3480156104c3575f80fd5b506102096104d2366004614f89565b6114de565b6104076104e536600461500a565b611667565b3480156104f5575f80fd5b506104075f80516020615b6e83398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614eec565b61169b565b34801561054e575f80fd5b506104075f80516020615b8e83398151915281565b34801561056e575f80fd5b5061020961057d366004614eec565b611884565b610407610590366004614eec565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614eec565b6119f2565b60405161024c91906150d3565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004615153565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615bce8339815191526020526040808220815160e0810190925280545f80516020615b8e83398151915293929190829060ff16600581111561068c5761068c61505e565b600581111561069d5761069d61505e565b81526020016001820180546106b1906151be565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd906151be565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156107935761079361505e565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611eed565b6040518263ffffffff1660e01b815260040161080791906151fe565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108479190615210565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615b8e8339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109119190615210565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161523b565b6001600160a01b03161461098e57610969606084016040850161523b565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c6060850185615256565b905090505f805b828163ffffffff161015610c84575f6109bf6060880188615256565b8363ffffffff168181106109d5576109d561529b565b90506020028101906109e791906152af565b6109f0906153d3565b80516040519192505f916008880191610a089161544c565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b815261063191906004016151fe565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a819161544c565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf9190615210565b90508086600801835f0151604051610ad7919061544c565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b5961505e565b021790555060208201516001820190610b7290826154a1565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615570565b8251604051919550610c289161544c565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d90615583565b90506109a3565b50600483018190555f610ca2610c9986611f3c565b60400151612052565b90505f610cae876121df565b90505f600282604051610cc1919061544c565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff9190615210565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd5836123b9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a826123ca565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b61505e565b14610e8b578060405163170cc93360e21b815260040161063191906151f0565b6108478383612405565b5f610ea564e8d4a51000836155a5565b92915050565b61084783838361267f565b610ebe612878565b5f80516020615b6e8339815191525f80610ed7846128af565b91509150610ee4826123ca565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f61505e565b03610f44575f83815260078501602052604081208054919055610f428282612bed565b505b610f5a81610f5584604001516111e3565b612c4b565b505050505b610f7560015f80516020615bae83398151915255565b50565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff166003811115610fc557610fc561505e565b6003811115610fd657610fd661505e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b90506001835160038111156110635761106361505e565b14611084578251604051633b0d540d60e21b815261063191906004016155c4565b6004815160058111156110995761109961505e565b036110af576110a785612c71565b505050505050565b5f806110c66110bd89611f3c565b60400151612e58565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a510006155de565b5f611206826119f2565b6080015192915050565b61121b83838361267f565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615b6e8339815191525f611253836119f2565b519050600481600581111561126a5761126a61505e565b1461128a578060405163170cc93360e21b815260040161063191906151f0565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612bed565b61130e612878565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff16600381111561135b5761135b61505e565b600381111561136c5761136c61505e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e561505e565b14611406578051604051633b0d540d60e21b815261063191906004016155c4565b600461141582604001516119f2565b5160058111156114275761142761505e565b146114b9575f61143685611f3c565b90505f806114478360400151612e58565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c71565b50506114da60015f80516020615bae83398151915255565b5050565b5f80516020615b8e8339815191525f806115036114fa85611f3c565b604001516130ae565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f82815260068401602052604090208054611543906151be565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d61505e565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b5f82815260068401602052604081206115d891614e05565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611670612878565b61167c8484843461326a565b905061169460015f80516020615bae83398151915255565b9392505050565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff1660038111156116e8576116e861505e565b60038111156116f9576116f961505e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117725761177261505e565b1415801561179357506003815160038111156117905761179061505e565b14155b156117b4578051604051633b0d540d60e21b815261063191906004016155c4565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611eed565b6040518263ffffffff1660e01b815260040161183d91906151fe565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d9190615210565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615b8e83398151915291906118cb906151be565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff1660058111156119155761191561505e565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161198191906004016155f5565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190615210565b5f6119ca612878565b6119d5823334613438565b90506119ed60015f80516020615bae83398151915255565b919050565b6119fa614e3c565b5f8281525f80516020615bce833981519152602052604090819020815160e0810190925280545f80516020615b8e833981519152929190829060ff166005811115611a4757611a4761505e565b6005811115611a5857611a5861505e565b8152602001600182018054611a6c906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054611a98906151be565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615b8e833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b84908690869061567f565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e8339815191529284929091829060ff166003811115611bea57611bea61505e565b6003811115611bfb57611bfb61505e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c8861505e565b14611ca9578251604051633b0d540d60e21b815261063191906004016155c4565b60028401546080840151611cc6916001600160401b03169061568e565b6001600160401b0316421015611cfa5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b60208301516001600160a01b03163314611d96575f8281526004850160205260409020546001600160a01b03163314611d3357336112ab565b5f82815260048501602052604090205460a0820151611d6291600160b01b90046001600160401b03169061568e565b6001600160401b0316421015611d965760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b600281516005811115611dab57611dab61505e565b03611e88578615611dc257611dc08287612405565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611dfb918491611df691906156ae565b61370d565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e3c84613864565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e9d57611e9d61505e565b03611ed157611eab83613864565b5f898152600686016020526040902055611ec488612c71565b6001945050505050611694565b805160405163170cc93360e21b815261063191906004016151f0565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fa0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fc791908101906156d9565b9150915080611fe957604051636b2f19e960e01b815260040160405180910390fd5b81511561200f578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561204b576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461208757815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b60028110156120d65761209e8160016157ab565b6120a99060086155de565b61ffff168482815181106120bf576120bf61529b565b016020015160f81c901b919091179060010161208a565b5061ffff8116156121005760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561215b576121178160036157ab565b6121229060086155de565b63ffffffff1685612134836002615570565b815181106121445761214461529b565b016020015160f81c901b9190911790600101612103565b5063ffffffff81161561218157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121d65761219881601f6157ab565b6121a39060086155de565b866121af836006615570565b815181106121bf576121bf61529b565b016020015160f81c901b9190911790600101612184565b50949350505050565b60605f808335602085013560146121fb8787016040890161523b565b6122086060890189615256565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61228e6060850185615256565b905081101561204b57816122a56060860186615256565b838181106122b5576122b561529b565b90506020028101906122c791906152af565b6122d190806157be565b90506122e06060870187615256565b848181106122f0576122f061529b565b905060200281019061230291906152af565b61230c90806157be565b6123196060890189615256565b868181106123295761232961529b565b905060200281019061233b91906152af565b6123499060208101906157be565b61235660608b018b615256565b888181106123665761236661529b565b905060200281019061237891906152af565b612389906060810190604001614fe0565b60405160200161239f9796959493929190615800565b60408051601f198184030181529190529150600101612281565b6123c1613a10565b610f7581613a5b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261247791908101906156d9565b915091508061249957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125009190615210565b825114612526578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612562576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125718460400151613ac9565b915091508187146125985760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615b6e833981519152906001600160401b039081169083161115612655575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612674565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b6e8339815191528161269886613cba565b90506126a3866123ca565b6126b257600192505050611694565b5f8681526004830160205260409020546001600160a01b031633146126d757336112ab565b5f86815260048301602052604090205460a082015161270691600160b01b90046001600160401b03169061568e565b6001600160401b03168160c001516001600160401b0316101561274d5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156127655761275e8786612405565b9050612783565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906127a8906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561281e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128429190615210565b905080846007015f8a81526020019081526020015f205f8282546128669190615570565b90915550501515979650505050505050565b5f80516020615bae8339815191528054600119016128a957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128b8614e3c565b5f80516020615b8e8339815191525f806128d46114fa87611f3c565b9150915080156128fb57604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561292c5761292c61505e565b600581111561293d5761293d61505e565b8152602001600182018054612951906151be565b80601f016020809104026020016040519081016040528092919081815260200182805461297d906151be565b80156129c85780601f1061299f576101008083540402835291602001916129c8565b820191905f5260205f20905b8154815290600101906020018083116129ab57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a3357612a3361505e565b14158015612a545750600181516005811115612a5157612a5161505e565b14155b15612a7557805160405163170cc93360e21b815261063191906004016151f0565b600381516005811115612a8a57612a8a61505e565b03612a985760048152612a9d565b600581525b836008018160200151604051612ab3919061544c565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612af757612af761505e565b021790555060208201516001820190612b1090826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bb657612bb661505e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c39575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f9e565b60015f80516020615bae83398151915255565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff166003811115612cbe57612cbe61505e565b6003811115612ccf57612ccf61505e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dfd575f84815260048701602052604090205461271090612daf90600160a01b900461ffff16856155de565b612db991906155a5565b915081866007015f8681526020019081526020015f205f828254612ddd9190615570565b90915550612ded905082846157ab565b9050612dfd856020015182612bed565b612e128560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e8f57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612ede57612ea68160016157ab565b612eb19060086155de565b61ffff16868281518110612ec757612ec761529b565b016020015160f81c901b9190911790600101612e92565b5061ffff811615612f085760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f6357612f1f8160036157ab565b612f2a9060086155de565b63ffffffff1687612f3c836002615570565b81518110612f4c57612f4c61529b565b016020015160f81c901b9190911790600101612f0b565b5063ffffffff8116600314612f8b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fe057612fa281601f6157ab565b612fad9060086155de565b88612fb9836006615570565b81518110612fc957612fc961529b565b016020015160f81c901b9190911790600101612f8e565b505f805b600881101561303f57612ff88160076157ab565b6130039060086155de565b6001600160401b031689613018836026615570565b815181106130285761302861529b565b016020015160f81c901b9190911790600101612fe4565b505f805b600881101561309e576130578160076157ab565b6130629060086155de565b6001600160401b03168a61307783602e615570565b815181106130875761308761529b565b016020015160f81c901b9190911790600101613043565b5091989097509095509350505050565b5f8082516027146130e457825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b6002811015613133576130fb8160016157ab565b6131069060086155de565b61ffff1685828151811061311c5761311c61529b565b016020015160f81c901b91909117906001016130e7565b5061ffff81161561315d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156131b8576131748160036157ab565b61317f9060086155de565b63ffffffff1686613191836002615570565b815181106131a1576131a161529b565b016020015160f81c901b9190911790600101613160565b5063ffffffff81166002146131e057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613235576131f781601f6157ab565b6132029060086155de565b8761320e836006615570565b8151811061321e5761321e61529b565b016020015160f81c901b91909117906001016131e3565b505f8660268151811061324a5761324a61529b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b6e83398151915290600160401b900461ffff90811690861610806132be575061271061ffff8616115b156132e257604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b03908116908516101561331e576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806133305750806001015483115b156133515760405163222d164360e21b815260048101849052602401610631565b825f61335c82610e95565b90505f6133698983614031565b9050604051806080016040528061337d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615b6e8339815191528161345184610e95565b90505f61345d876119f2565b9050613468876123ca565b613488576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561349d5761349d61505e565b146134be57805160405163170cc93360e21b815261063191906004016151f0565b5f8282608001516134cf919061568e565b905083600201600a9054906101000a90046001600160401b031682604001516134f89190615869565b6001600160401b0316816001600160401b0316111561353557604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806135418a8461370d565b915091505f8a8360405160200161356f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136025761360261505e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615bce833981519152602052604081206002015481905f80516020615b8e83398151915290600160801b90046001600160401b031661375585826145a9565b5f61375f87614783565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137af8a858b611eed565b6040518263ffffffff1660e01b81526004016137cb91906151fe565b6020604051808303815f875af11580156137e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061380b9190615210565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b6e83398151915290505f61388484604001516119f2565b90505f60038251600581111561389c5761389c61505e565b14806138ba57506004825160058111156138b8576138b861505e565b145b156138ca575060c0810151613907565b6002825160058111156138df576138df61505e565b036138eb575042613907565b815160405163170cc93360e21b815261063191906004016151f0565b84608001516001600160401b0316816001600160401b03161161392e57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613953906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156139e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a079190615210565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a5957604051631afcd79f60e31b815260040160405180910390fd5b565b613a63613a10565b613a6c816147f8565b613a74614811565b610f7560608201356080830135613a9160c0850160a08601614fe0565b613aa160e0860160c08701615894565b613ab2610100870160e088016158ad565b613ac46101208801610100890161523b565b614821565b5f808251602e14613aff57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b4e57613b168160016157ab565b613b219060086155de565b61ffff16858281518110613b3757613b3761529b565b016020015160f81c901b9190911790600101613b02565b5061ffff811615613b785760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613bd357613b8f8160036157ab565b613b9a9060086155de565b63ffffffff1686613bac836002615570565b81518110613bbc57613bbc61529b565b016020015160f81c901b9190911790600101613b7b565b5063ffffffff811615613bf957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c4e57613c1081601f6157ab565b613c1b9060086155de565b87613c27836006615570565b81518110613c3757613c3761529b565b016020015160f81c901b9190911790600101613bfc565b505f805b6008811015613cad57613c668160076157ab565b613c719060086155de565b6001600160401b031688613c86836026615570565b81518110613c9657613c9661529b565b016020015160f81c901b9190911790600101613c52565b5090969095509350505050565b613cc2614e3c565b5f8281525f80516020615bce8339815191526020526040808220815160e0810190925280545f80516020615b8e83398151915293929190829060ff166005811115613d0f57613d0f61505e565b6005811115613d2057613d2061505e565b8152602001600182018054613d34906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054613d60906151be565b8015613dab5780601f10613d8257610100808354040283529160200191613dab565b820191905f5260205f20905b815481529060010190602001808311613d8e57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613e1957613e1961505e565b14613e4c575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e9057613e9061505e565b021790555060208201516001820190613ea990826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f47858261370d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613fc15760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461400a576040519150601f19603f3d011682016040523d82523d5f602084013e61400f565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661407557604051637fab81e560e01b815260040160405180910390fd5b5f80516020615b8e833981519152426140946060860160408701614fe0565b6001600160401b03161115806140ce57506140b26202a30042615570565b6140c26060860160408701614fe0565b6001600160401b031610155b15614108576140e36060850160408601614fe0565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b61411d61411860608601866158cd565b6149b7565b61412d61411860808601866158cd565b603061413c60208601866157be565b90501461416e5761415060208501856157be565b6040516326475b2f60e11b8152610631925060040190815260200190565b61417884806157be565b90505f036141a55761418a84806157be565b604051633e08a12560e11b81526004016106319291906158e1565b5f600882016141b486806157be565b6040516141c292919061567f565b908152602001604051809103902054146141fb576141e084806157be565b60405163a41f772f60e01b81526004016106319291906158e1565b614205835f6145a9565b6040805160e08101909152815481525f908190614311906020810161422a89806157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614272908a018a6157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016142bb60608a0160408b01614fe0565b6001600160401b031681526020016142d660608a018a6158cd565b6142df9061590f565b81526020016142f160808a018a6158cd565b6142fa9061590f565b8152602001876001600160401b0316815250614b20565b5f8281526006860160205260409020919350915061432f82826154a1565b50816008840161433f88806157be565b60405161434d92919061567f565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143899085906004016151fe565b6020604051808303815f875af11580156143a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143c99190615210565b6040805160e0810190915290915080600181526020016143e989806157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156144785761447861505e565b02179055506020820151600182019061449190826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061452f88806157be565b60405161453d92919061567f565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061457b9190614fe0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615b8e8339815191525f6001600160401b0380841690851611156145dd576145d683856156ae565b90506145ea565b6145e784846156ae565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061464c575060018401548151614648916001600160401b031690615570565b8210155b15614672576001600160401b038316606082015281815260408101516020820152614691565b8281606001818151614684919061568e565b6001600160401b03169052505b60608101516146a1906064615869565b602082015160018601546001600160401b0392909216916146cc9190600160401b900460ff166155de565b10156146fc57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516147179190615570565b9052506040810180516001600160401b03871691906147379083906157ab565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bce8339815191526020526040812060020180545f80516020615b8e83398151915291906008906147cd90600160401b90046001600160401b03166159d6565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614800613a10565b614808614d0d565b610f7581614d15565b614819613a10565b613a59614dfd565b614829613a10565b5f80516020615b6e83398151915261ffff8416158061484d575061271061ffff8516115b1561487157604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156148955760405163222d164360e21b815260048101889052602401610631565b60ff831615806148a85750600a60ff8416115b156148cb5760405163170db35960e31b815260ff84166004820152602401610631565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316856001600160401b03161015614932576040516202a06d60e11b81526001600160401b0386166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6149c46020820182614f89565b63ffffffff161580156149e457506149df6020820182615256565b151590505b15614a2b576149f66020820182614f89565b614a036020830183615256565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b614a386020820182615256565b9050614a476020830183614f89565b63ffffffff161115614a60576149f66020820182614f89565b60015b614a706020830183615256565b90508110156114da57614a866020830183615256565b614a916001846157ab565b818110614aa057614aa061529b565b9050602002016020810190614ab5919061523b565b6001600160a01b0316614acb6020840184615256565b83818110614adb57614adb61529b565b9050602002016020810190614af0919061523b565b6001600160a01b03161015614b1857604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a63565b5f6060826040015151603014614b495760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b8a988a9860019892979296909590949093909291016159f1565b60405160208183030381529060405290505f5b84608001516020015151811015614bfc57818560800151602001518281518110614bc957614bc961529b565b6020026020010151604051602001614be2929190615aab565b60408051601f198184030181529190529150600101614b9d565b5060a0840151805160209182015151604051614c1c938593929101615ae1565b60405160208183030381529060405290505f5b8460a001516020015151811015614c8e57818560a00151602001518281518110614c5b57614c5b61529b565b6020026020010151604051602001614c74929190615aab565b60408051601f198184030181529190529150600101614c2f565b5060c0840151604051614ca5918391602001615b1c565b6040516020818303038152906040529050600281604051614cc6919061544c565b602060405180830381855afa158015614ce1573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d049190615210565b94909350915050565b613a59613a10565b614d1d613a10565b80355f80516020615b8e8339815191529081556014614d4260608401604085016158ad565b60ff161180614d615750614d5c60608301604084016158ad565b60ff16155b15614d9557614d7660608301604084016158ad565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614da560608301604084016158ad565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614dd66040830160208401614fe0565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c5e613a10565b508054614e11906151be565b5f825580601f10614e20575050565b601f0160209004905f5260205f2090810190610f759190614e79565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e8d575f8155600101614e7a565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614ec3575f80fd5b833592506020840135614ed581614e91565b9150614ee360408501614e9e565b90509250925092565b5f60208284031215614efc575f80fd5b5035919050565b5f8060408385031215614f14575f80fd5b82356001600160401b03811115614f29575f80fd5b830160808186031215614f3a575f80fd5b9150614f4860208401614e9e565b90509250929050565b5f6101208284031215614f62575f80fd5b50919050565b5f8060408385031215614f79575f80fd5b82359150614f4860208401614e9e565b5f60208284031215614f99575f80fd5b61169482614e9e565b5f8060408385031215614fb3575f80fd5b614fbc83614e9e565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614ff0575f80fd5b61169482614fca565b803561ffff811681146119ed575f80fd5b5f805f6060848603121561501c575f80fd5b83356001600160401b03811115615031575f80fd5b840160a08187031215615042575f80fd5b925061505060208501614ff9565b9150614ee360408501614fca565b634e487b7160e01b5f52602160045260245ffd5b600681106150825761508261505e565b9052565b5f5b838110156150a0578181015183820152602001615088565b50505f910152565b5f81518084526150bf816020860160208601615086565b601f01601f19169290920160200192915050565b602081526150e5602082018351615072565b5f602083015160e060408401526151006101008401826150a8565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615164575f80fd5b82356001600160401b038082111561517a575f80fd5b818501915085601f83011261518d575f80fd5b81358181111561519b575f80fd5b8660208285010111156151ac575f80fd5b60209290920196919550909350505050565b600181811c908216806151d257607f821691505b602082108103614f6257634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284615072565b602081525f61169460208301846150a8565b5f60208284031215615220575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561524b575f80fd5b813561169481615227565b5f808335601e1984360301811261526b575f80fd5b8301803591506001600160401b03821115615284575f80fd5b6020019150600581901b360382131561385d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152c3575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615303576153036152cd565b60405290565b604080519081016001600160401b0381118282101715615303576153036152cd565b604051601f8201601f191681016001600160401b0381118282101715615353576153536152cd565b604052919050565b5f6001600160401b03821115615373576153736152cd565b50601f01601f191660200190565b5f82601f830112615390575f80fd5b81356153a361539e8261535b565b61532b565b8181528460208386010111156153b7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153e3575f80fd5b6153eb6152e1565b82356001600160401b0380821115615401575f80fd5b61540d36838701615381565b83526020850135915080821115615422575f80fd5b5061542f36828601615381565b60208301525061544160408401614fca565b604082015292915050565b5f82516152c3818460208701615086565b601f82111561063a57805f5260205f20601f840160051c810160208510156154825750805b601f840160051c820191505b8181101561187d575f815560010161548e565b81516001600160401b038111156154ba576154ba6152cd565b6154ce816154c884546151be565b8461545d565b602080601f831160018114615501575f84156154ea5750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561552f57888601518255948401946001909101908401615510565b508582101561554c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea561555c565b5f63ffffffff80831681810361559b5761559b61555c565b6001019392505050565b5f826155bf57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155d8576155d861505e565b91905290565b8082028115828204841417610ea557610ea561555c565b5f60208083525f8454615607816151be565b806020870152604060018084165f8114615628576001811461564457615671565b60ff19851660408a0152604084151560051b8a01019550615671565b895f5260205f205f5b858110156156685781548b820186015290830190880161564d565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561204b5761204b61555c565b6001600160401b0382811682821603908082111561204b5761204b61555c565b80516119ed81614e91565b5f80604083850312156156ea575f80fd5b82516001600160401b0380821115615700575f80fd5b9084019060608287031215615713575f80fd5b61571b6152e1565b8251815260208084015161572e81615227565b82820152604084015183811115615743575f80fd5b80850194505087601f850112615757575f80fd5b8351925061576761539e8461535b565b838152888285870101111561577a575f80fd5b61578984838301848801615086565b8060408401525081955061579e8188016156ce565b9450505050509250929050565b81810381811115610ea557610ea561555c565b5f808335601e198436030181126157d3575f80fd5b8301803591506001600160401b038211156157ec575f80fd5b60200191503681900382131561385d575f80fd5b5f8851615811818460208d01615086565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461588c5761588c61555c565b505092915050565b5f602082840312156158a4575f80fd5b61169482614ff9565b5f602082840312156158bd575f80fd5b813560ff81168114611694575f80fd5b5f8235603e198336030181126152c3575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6040823603121561591f575f80fd5b615927615309565b61593083614e9e565b81526020808401356001600160401b038082111561594c575f80fd5b9085019036601f83011261595e575f80fd5b813581811115615970576159706152cd565b8060051b915061598184830161532b565b818152918301840191848101903684111561599a575f80fd5b938501935b838510156159c457843592506159b483615227565b828252938501939085019061599f565b94860194909452509295945050505050565b5f6001600160401b0380831681810361559b5761559b61555c565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a3781602a850160208b01615086565b865190830190615a4e81602a840160208b01615086565b60c087901b6001600160c01b031916602a9290910191820152615a80603282018660e01b6001600160e01b0319169052565b615a99603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615abc818460208801615086565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615af2818460208901615086565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b2d818460208801615086565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index dcfa9ed5f..ea7a9b5a4 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -42,7 +42,7 @@ abstract contract PoSValidatorManager is uint256 _minimumStakeAmount; /// @notice The maximum amount of stake allowed to be a validator. uint256 _maximumStakeAmount; - /// @notice The minimum amount of time a validator must be staked for. + /// @notice The minimum amount of time in seconds a validator must be staked for. Must be at least {_churnPeriodSeconds}. uint64 _minimumStakeDuration; /// @notice The minimum delegation fee percentage, in basis points, required to delegate to a validator. uint16 _minimumDelegationFeeBips; @@ -139,6 +139,10 @@ abstract contract PoSValidatorManager is { revert InvalidStakeMultiplier(maximumStakeMultiplier); } + // Minimum stake duration should be at least one churn period in order to prevent churn tracker abuse. + if (minimumStakeDuration < _getChurnPeriodSeconds()) { + revert InvalidMinStakeDuration(minimumStakeDuration); + } $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; @@ -491,19 +495,25 @@ abstract contract PoSValidatorManager is if (delegator.status != DelegatorStatus.Active) { revert InvalidDelegatorStatus(delegator.status); } + + // Check that minimum stake duration has passed. + if (block.timestamp < delegator.startedAt + $._minimumStakeDuration) { + revert MinStakeDurationNotPassed(uint64(block.timestamp)); + } + // Only the delegation owner or parent validator can end the delegation. if (delegator.owner != _msgSender()) { // Validators can only remove delegations after the minimum stake duration has passed. - if ($._posValidatorInfo[validationID].owner == _msgSender()) { - if ( - block.timestamp - < validator.startedAt + $._posValidatorInfo[validationID].minStakeDuration - ) { - revert MinStakeDurationNotPassed(uint64(block.timestamp)); - } - } else { + if ($._posValidatorInfo[validationID].owner != _msgSender()) { revert UnauthorizedOwner(_msgSender()); } + + if ( + block.timestamp + < validator.startedAt + $._posValidatorInfo[validationID].minStakeDuration + ) { + revert MinStakeDurationNotPassed(uint64(block.timestamp)); + } } if (validator.status == ValidatorStatus.Active) { diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 714afa58a..e17ef9e06 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -530,6 +530,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida return (nonce, messageID); } + function _getChurnPeriodSeconds() internal view returns (uint64) { + return _getValidatorManagerStorage()._churnPeriodSeconds; + } + /** * @dev Helper function to check if the stake weight to be added or removed would exceed the maximum stake churn * rate for the past churn period. If the churn rate is exceeded, the function will revert. If the churn rate is From 9bf825af791af8420bcc99e5c2da1a40569ca214 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 14:18:16 -0400 Subject: [PATCH 10/35] Check delegator against min stake duration if the validator is still active --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 0b496a6b7..6569e8571 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -91,7 +91,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161603c38038061603c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615eef8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b61020961020436600461510d565b6104a8565b005b610209610219366004615148565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b36600461510d565b6106eb565b61020961025e36600461515f565b6106f6565b6102096102713660046151ad565b610be2565b610289610284366004615148565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb36600461510d565b610c6c565b6102096102de3660046151ce565b610c77565b6102f66102f136600461520e565b610d39565b604051908152602001610234565b610209610312366004615273565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f661034236600461529b565b610fd9565b610289610355366004615148565b610ff2565b6102f65f81565b61020961036f36600461510d565b611006565b610226603081565b61020961038a366004615148565b611031565b61020961039d366004615273565b6110fc565b6102f66103b03660046152b4565b6112d4565b6102096103c33660046151ce565b611300565b6102f65f80516020615e6383398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004615148565b611489565b6102f65f80516020615e8383398151915281565b610209610437366004615148565b611672565b610226601481565b610457610452366004615148565b6117af565b6040516102349190615349565b6102896202a30081565b6102f65f80516020615e4383398151915281565b6102096104903660046153dd565b6118fe565b6102f66104a336600461541b565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615ec38339815191526020526040808220815160e0810190925280545f80516020615e8383398151915293929190829060ff16600581111561052a5761052a6152d4565b600581111561053b5761053b6152d4565b815260200160018201805461054f90615486565b80601f016020809104026020016040519081016040528092919081815260200182805461057b90615486565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115610631576106316152d4565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d90565b6040518263ffffffff1660e01b81526004016106a591906154cc565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e591906154de565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615e838339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af91906154de565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e960608501604086016154f5565b6001600160a01b03161461082c5761080760608401604085016154f5565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a6060850185615510565b905090505f805b828163ffffffff161015610b22575f61085d6060880188615510565b8363ffffffff1681811061087357610873615555565b90506020028101906108859190615569565b61088e9061568d565b80516040519192505f9160088801916108a691615706565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf91906004016154cc565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f91615706565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d91906154de565b90508086600801835f01516040516109759190615706565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f76152d4565b021790555060208201516001820190610a10908261575b565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab591168561582a565b8251604051919550610ac691615706565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b9061583d565b9050610841565b50600483018190555f610b40610b3786611ddf565b60400151611ef5565b90505f610b4c87612082565b90505f600282604051610b5f9190615706565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d91906154de565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb8261225c565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c6152d4565b14610c4c578060405163170cc93360e21b81526004016104cf91906154be565b6106e58383612297565b5f610c6664e8d4a510008361585f565b92915050565b6106e5838383612511565b610c7f61270a565b5f80516020615e638339815191525f80610c9884612741565b91509150610ca58261225c565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce06152d4565b03610d05575f83815260078501602052604081208054919055610d038282612a7f565b505b610d1b81610d168460400151610fd9565b612af5565b505050505b610d3660015f80516020615ea383398151915255565b50565b5f610d4261270a565b610d4e85858585612b2b565b9050610d6660015f80516020615ea383398151915255565b949350505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115610dbb57610dbb6152d4565b6003811115610dcc57610dcc6152d4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e596152d4565b14610e7a578251604051633b0d540d60e21b81526104cf919060040161587e565b600481516005811115610e8f57610e8f6152d4565b03610ea557610e9d85612d04565b505050505050565b5f80610ebc610eb389611ddf565b60400151612eeb565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a51000615898565b5f610ffc826117af565b6080015192915050565b611011838383612511565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615e638339815191525f611049836117af565b5190506004816005811115611060576110606152d4565b14611080578060405163170cc93360e21b81526004016104cf91906154be565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a7f565b61110461270a565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115611151576111516152d4565b6003811115611162576111626152d4565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db6152d4565b146111fc578051604051633b0d540d60e21b81526104cf919060040161587e565b600461120b82604001516117af565b51600581111561121d5761121d6152d4565b146112af575f61122c85611ddf565b90505f8061123d8360400151612eeb565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612d04565b50506112d060015f80516020615ea383398151915255565b5050565b5f6112dd61270a565b6112e8833384613141565b9050610c6660015f80516020615ea383398151915255565b5f80516020615e838339815191525f8061132561131c85611ddf565b60400151613419565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f8281526006840160205260409020805461136590615486565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af6152d4565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b5f82815260068401602052604081206113fa9161505c565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff1660038111156114d6576114d66152d4565b60038111156114e7576114e76152d4565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611560576115606152d4565b14158015611581575060038151600381111561157e5761157e6152d4565b14155b156115a2578051604051633b0d540d60e21b81526104cf919060040161587e565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d90565b6040518263ffffffff1660e01b815260040161162b91906154cc565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b91906154de565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615e8383398151915291906116b990615486565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff166005811115611703576117036152d4565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016158af565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906154de565b6117b7615093565b5f8281525f80516020615ec3833981519152602052604090819020815160e0810190925280545f80516020615e83833981519152929190829060ff166005811115611804576118046152d4565b6005811115611815576118156152d4565b815260200160018201805461182990615486565b80601f016020809104026020016040519081016040528092919081815260200182805461185590615486565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561199084846135d5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615e83833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615939565b90815260200160405180910390205491505092915050565b5f8381525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e638339815191529284929091829060ff166003811115611a8657611a866152d4565b6003811115611a9757611a976152d4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b246152d4565b14611b45578251604051633b0d540d60e21b81526104cf919060040161587e565b60028401546080840151611b62916001600160401b031690615948565b6001600160401b0316421015611b965760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b60208301516001600160a01b03163314611c32575f8281526004850160205260409020546001600160a01b03163314611bcf57336110a1565b5f82815260048501602052604090205460a0820151611bfe91600160b01b90046001600160401b031690615948565b6001600160401b0316421015611c325760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b600281516005811115611c4757611c476152d4565b03611d24578615611c5e57611c5c8287612297565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c97918491611c929190615968565b6135ef565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611cd884613746565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d899350505050565b600481516005811115611d3957611d396152d4565b03611d6d57611d4783613746565b5f898152600686016020526040902055611d6088612d04565b6001945050505050611d89565b805160405163170cc93360e21b81526104cf91906004016154be565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e6a9190810190615993565b9150915080611e8c57604051636b2f19e960e01b815260040160405180910390fd5b815115611eb2578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611eee576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611f2a57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f7957611f41816001615a65565b611f4c906008615898565b61ffff16848281518110611f6257611f62615555565b016020015160f81c901b9190911790600101611f2d565b5061ffff811615611fa35760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611ffe57611fba816003615a65565b611fc5906008615898565b63ffffffff1685611fd783600261582a565b81518110611fe757611fe7615555565b016020015160f81c901b9190911790600101611fa6565b5063ffffffff81161561202457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120795761203b81601f615a65565b612046906008615898565b8661205283600661582a565b8151811061206257612062615555565b016020015160f81c901b9190911790600101612027565b50949350505050565b60605f8083356020850135601461209e878701604089016154f5565b6120ab6060890189615510565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121316060850185615510565b9050811015611eee57816121486060860186615510565b8381811061215857612158615555565b905060200281019061216a9190615569565b6121749080615a78565b90506121836060870187615510565b8481811061219357612193615555565b90506020028101906121a59190615569565b6121af9080615a78565b6121bc6060890189615510565b868181106121cc576121cc615555565b90506020028101906121de9190615569565b6121ec906020810190615a78565b6121f960608b018b615510565b8881811061220957612209615555565b905060200281019061221b9190615569565b61222c90606081019060400161529b565b6040516020016122429796959493929190615aba565b60408051601f198184030181529190529150600101612124565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122e2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123099190810190615993565b915091508061232b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561236e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061239291906154de565b8251146123b8578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123f4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f8061240384604001516138f2565b9150915081871461242a5760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615e63833981519152906001600160401b0390811690831611156124e7575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612506565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e638339815191528161252a86613ae3565b90506125358661225c565b61254457600192505050611d89565b5f8681526004830160205260409020546001600160a01b0316331461256957336110a1565b5f86815260048301602052604090205460a082015161259891600160b01b90046001600160401b031690615948565b6001600160401b03168160c001516001600160401b031610156125df5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125f7576125f08786612297565b9050612615565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061263a90610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156126b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d491906154de565b905080846007015f8a81526020019081526020015f205f8282546126f8919061582a565b90915550501515979650505050505050565b5f80516020615ea383398151915280546001190161273b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61274a615093565b5f80516020615e838339815191525f8061276661131c87611ddf565b91509150801561278d57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127be576127be6152d4565b60058111156127cf576127cf6152d4565b81526020016001820180546127e390615486565b80601f016020809104026020016040519081016040528092919081815260200182805461280f90615486565b801561285a5780601f106128315761010080835404028352916020019161285a565b820191905f5260205f20905b81548152906001019060200180831161283d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128c5576128c56152d4565b141580156128e657506001815160058111156128e3576128e36152d4565b14155b1561290757805160405163170cc93360e21b81526104cf91906004016154be565b60038151600581111561291c5761291c6152d4565b0361292a576004815261292f565b600581525b8360080181602001516040516129459190615706565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612989576129896152d4565b0217905550602082015160018201906129a2908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a4857612a486152d4565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e4383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ada575f80fd5b505af1158015612aec573d5f803e3d5ffd5b50505050505050565b5f80516020615e43833981519152546112d0906001600160a01b03168383613dc7565b60015f80516020615ea383398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e6383398151915290600160401b900461ffff9081169086161080612b7f575061271061ffff8616115b15612ba357604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612bdf576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612bf15750806001015483115b15612c125760405163222d164360e21b8152600481018490526024016104cf565b5f612c1c84613e26565b90505f612c2882610c56565b90505f612c358983613e49565b90506040518060800160405280612c493390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115612d5157612d516152d4565b6003811115612d6257612d626152d4565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e90575f84815260048701602052604090205461271090612e4290600160a01b900461ffff1685615898565b612e4c919061585f565b915081866007015f8681526020019081526020015f205f828254612e70919061582a565b90915550612e8090508284615a65565b9050612e90856020015182612a7f565b612ea58560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f2257835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f7157612f39816001615a65565b612f44906008615898565b61ffff16868281518110612f5a57612f5a615555565b016020015160f81c901b9190911790600101612f25565b5061ffff811615612f9b5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612ff657612fb2816003615a65565b612fbd906008615898565b63ffffffff1687612fcf83600261582a565b81518110612fdf57612fdf615555565b016020015160f81c901b9190911790600101612f9e565b5063ffffffff811660031461301e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130735761303581601f615a65565b613040906008615898565b8861304c83600661582a565b8151811061305c5761305c615555565b016020015160f81c901b9190911790600101613021565b505f805b60088110156130d25761308b816007615a65565b613096906008615898565b6001600160401b0316896130ab83602661582a565b815181106130bb576130bb615555565b016020015160f81c901b9190911790600101613077565b505f805b6008811015613131576130ea816007615a65565b6130f5906008615898565b6001600160401b03168a61310a83602e61582a565b8151811061311a5761311a615555565b016020015160f81c901b91909117906001016130d6565b5091989097509095509350505050565b5f5f80516020615e638339815191528161315d61028485613e26565b90505f613169876117af565b90506131748761225c565b613194576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156131a9576131a96152d4565b146131ca57805160405163170cc93360e21b81526104cf91906004016154be565b5f8282608001516131db9190615948565b905083600201600a9054906101000a90046001600160401b031682604001516132049190615b23565b6001600160401b0316816001600160401b0316111561324157604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f8061324d8a846135ef565b915091505f8a8360405160200161327b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561330e5761330e6152d4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461344f57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b600281101561349e57613466816001615a65565b613471906008615898565b61ffff1685828151811061348757613487615555565b016020015160f81c901b9190911790600101613452565b5061ffff8116156134c85760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613523576134df816003615a65565b6134ea906008615898565b63ffffffff16866134fc83600261582a565b8151811061350c5761350c615555565b016020015160f81c901b91909117906001016134cb565b5063ffffffff811660021461354b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135a05761356281601f615a65565b61356d906008615898565b8761357983600661582a565b8151811061358957613589615555565b016020015160f81c901b919091179060010161354e565b505f866026815181106135b5576135b5615555565b016020015191976001600160f81b03199092161515965090945050505050565b6135dd6143c1565b6135e68261440c565b6112d08161447a565b5f8281525f80516020615ec3833981519152602052604081206002015481905f80516020615e8383398151915290600160801b90046001600160401b031661363785826144e2565b5f613641876146bc565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136918a858b611d90565b6040518263ffffffff1660e01b81526004016136ad91906154cc565b6020604051808303815f875af11580156136c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136ed91906154de565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e6383398151915290505f61376684604001516117af565b90505f60038251600581111561377e5761377e6152d4565b148061379c575060048251600581111561379a5761379a6152d4565b145b156137ac575060c08101516137e9565b6002825160058111156137c1576137c16152d4565b036137cd5750426137e9565b815160405163170cc93360e21b81526104cf91906004016154be565b84608001516001600160401b0316816001600160401b03161161381057505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061383590610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156138c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138e991906154de565b95945050505050565b5f808251602e1461392857825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b60028110156139775761393f816001615a65565b61394a906008615898565b61ffff1685828151811061396057613960615555565b016020015160f81c901b919091179060010161392b565b5061ffff8116156139a15760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139fc576139b8816003615a65565b6139c3906008615898565b63ffffffff16866139d583600261582a565b815181106139e5576139e5615555565b016020015160f81c901b91909117906001016139a4565b5063ffffffff811615613a2257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a7757613a3981601f615a65565b613a44906008615898565b87613a5083600661582a565b81518110613a6057613a60615555565b016020015160f81c901b9190911790600101613a25565b505f805b6008811015613ad657613a8f816007615a65565b613a9a906008615898565b6001600160401b031688613aaf83602661582a565b81518110613abf57613abf615555565b016020015160f81c901b9190911790600101613a7b565b5090969095509350505050565b613aeb615093565b5f8281525f80516020615ec38339815191526020526040808220815160e0810190925280545f80516020615e8383398151915293929190829060ff166005811115613b3857613b386152d4565b6005811115613b4957613b496152d4565b8152602001600182018054613b5d90615486565b80601f0160208091040260200160405190810160405280929190818152602001828054613b8990615486565b8015613bd45780601f10613bab57610100808354040283529160200191613bd4565b820191905f5260205f20905b815481529060010190602001808311613bb757829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c4257613c426152d4565b14613c75575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cb957613cb96152d4565b021790555060208201516001820190613cd2908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d7085826135ef565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614731565b5f610c66825f80516020615e43833981519152546001600160a01b031690614792565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e8d57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615e8383398151915242613eac606086016040870161529b565b6001600160401b0316111580613ee65750613eca6202a3004261582a565b613eda606086016040870161529b565b6001600160401b031610155b15613f2057613efb606085016040860161529b565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613f35613f306060860186615b4e565b6148eb565b613f45613f306080860186615b4e565b6030613f546020860186615a78565b905014613f8657613f686020850185615a78565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f908480615a78565b90505f03613fbd57613fa28480615a78565b604051633e08a12560e11b81526004016104cf929190615b62565b5f60088201613fcc8680615a78565b604051613fda929190615939565b9081526020016040518091039020541461401357613ff88480615a78565b60405163a41f772f60e01b81526004016104cf929190615b62565b61401d835f6144e2565b6040805160e08101909152815481525f90819061412990602081016140428980615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061408a908a018a615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140d360608a0160408b0161529b565b6001600160401b031681526020016140ee60608a018a615b4e565b6140f790615b90565b815260200161410960808a018a615b4e565b61411290615b90565b8152602001876001600160401b0316815250614a54565b5f82815260068601602052604090209193509150614147828261575b565b5081600884016141578880615a78565b604051614165929190615939565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141a19085906004016154cc565b6020604051808303815f875af11580156141bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141e191906154de565b6040805160e0810190915290915080600181526020016142018980615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115614290576142906152d4565b0217905550602082015160018201906142a9908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143478880615a78565b604051614355929190615939565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614393919061529b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661440a57604051631afcd79f60e31b815260040160405180910390fd5b565b6144146143c1565b61441d81614c41565b614425614c5a565b610d366060820135608083013561444260c0850160a0860161529b565b61445260e0860160c08701615c57565b614463610100870160e08801615c70565b614475610120880161010089016154f5565b614c6a565b6144826143c1565b5f80516020615e438339815191526001600160a01b0382166144c257604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615e838339815191525f6001600160401b0380841690851611156145165761450f8385615968565b9050614523565b6145208484615968565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614585575060018401548151614581916001600160401b03169061582a565b8210155b156145ab576001600160401b0383166060820152818152604081015160208201526145ca565b82816060018181516145bd9190615948565b6001600160401b03169052505b60608101516145da906064615b23565b602082015160018601546001600160401b0392909216916146059190600160401b900460ff16615898565b101561463557606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b031681604001818151614650919061582a565b9052506040810180516001600160401b0387169190614670908390615a65565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615ec38339815191526020526040812060020180545f80516020615e83833981519152919060089061470690600160401b90046001600160401b0316615c90565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147456001600160a01b03841683614e00565b905080515f141580156147695750808060200190518101906147679190615cab565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156147d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147fc91906154de565b90506148136001600160a01b038516333086614e0d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614857573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061487b91906154de565b90508181116148e15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b6138e98282615a65565b6148f860208201826151ce565b63ffffffff1615801561491857506149136020820182615510565b151590505b1561495f5761492a60208201826151ce565b6149376020830183615510565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b61496c6020820182615510565b905061497b60208301836151ce565b63ffffffff1611156149945761492a60208201826151ce565b60015b6149a46020830183615510565b90508110156112d0576149ba6020830183615510565b6149c5600184615a65565b8181106149d4576149d4615555565b90506020020160208101906149e991906154f5565b6001600160a01b03166149ff6020840184615510565b83818110614a0f57614a0f615555565b9050602002016020810190614a2491906154f5565b6001600160a01b03161015614a4c57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614997565b5f6060826040015151603014614a7d5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614abe988a986001989297929690959094909390929101615cc6565b60405160208183030381529060405290505f5b84608001516020015151811015614b3057818560800151602001518281518110614afd57614afd615555565b6020026020010151604051602001614b16929190615d80565b60408051601f198184030181529190529150600101614ad1565b5060a0840151805160209182015151604051614b50938593929101615db6565b60405160208183030381529060405290505f5b8460a001516020015151811015614bc257818560a00151602001518281518110614b8f57614b8f615555565b6020026020010151604051602001614ba8929190615d80565b60408051601f198184030181529190529150600101614b63565b5060c0840151604051614bd9918391602001615df1565b6040516020818303038152906040529050600281604051614bfa9190615706565b602060405180830381855afa158015614c15573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c3891906154de565b94909350915050565b614c496143c1565b614c51614e46565b610d3681614e4e565b614c626143c1565b61440a614f36565b614c726143c1565b5f80516020615e6383398151915261ffff84161580614c96575061271061ffff8516115b15614cba57604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614cde5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614cf15750600a60ff8416115b15614d145760405163170db35960e31b815260ff841660048201526024016104cf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316856001600160401b03161015614d7b576040516202a06d60e11b81526001600160401b03861660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d8983835f614f3e565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613df4565b61440a6143c1565b614e566143c1565b80355f80516020615e838339815191529081556014614e7b6060840160408501615c70565b60ff161180614e9a5750614e956060830160408401615c70565b60ff16155b15614ece57614eaf6060830160408401615c70565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614ede6060830160408401615c70565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f0f604083016020840161529b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b186143c1565b606081471015614f635760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614f7e9190615706565b5f6040518083038185875af1925050503d805f8114614fb8576040519150601f19603f3d011682016040523d82523d5f602084013e614fbd565b606091505b5091509150614fcd868383614fd7565b9695505050505050565b606082614fec57614fe782615033565b611d89565b815115801561500357506001600160a01b0384163b155b1561502c57604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d89565b8051156150435780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461506890615486565b5f825580601f10615077575050565b601f0160209004905f5260205f2090810190610d3691906150d0565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156150e4575f81556001016150d1565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114615108575f80fd5b919050565b5f805f6060848603121561511f575f80fd5b833592506020840135615131816150e8565b915061513f604085016150f5565b90509250925092565b5f60208284031215615158575f80fd5b5035919050565b5f8060408385031215615170575f80fd5b82356001600160401b03811115615185575f80fd5b830160808186031215615196575f80fd5b91506151a4602084016150f5565b90509250929050565b5f80604083850312156151be575f80fd5b823591506151a4602084016150f5565b5f602082840312156151de575f80fd5b611d89826150f5565b803561ffff81168114615108575f80fd5b80356001600160401b0381168114615108575f80fd5b5f805f8060808587031215615221575f80fd5b84356001600160401b03811115615236575f80fd5b850160a08188031215615247575f80fd5b9350615255602086016151e7565b9250615263604086016151f8565b9396929550929360600135925050565b5f8060408385031215615284575f80fd5b61528d836150f5565b946020939093013593505050565b5f602082840312156152ab575f80fd5b611d89826151f8565b5f80604083850312156152c5575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106152f8576152f86152d4565b9052565b5f5b838110156153165781810151838201526020016152fe565b50505f910152565b5f81518084526153358160208601602086016152fc565b601f01601f19169290920160200192915050565b6020815261535b6020820183516152e8565b5f602083015160e0604084015261537661010084018261531e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f808284036101408112156153f0575f80fd5b610120808212156153ff575f80fd5b8493508301359050615410816153c9565b809150509250929050565b5f806020838503121561542c575f80fd5b82356001600160401b0380821115615442575f80fd5b818501915085601f830112615455575f80fd5b813581811115615463575f80fd5b866020828501011115615474575f80fd5b60209290920196919550909350505050565b600181811c9082168061549a57607f821691505b6020821081036154b857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c6682846152e8565b602081525f611d89602083018461531e565b5f602082840312156154ee575f80fd5b5051919050565b5f60208284031215615505575f80fd5b8135611d89816153c9565b5f808335601e19843603018112615525575f80fd5b8301803591506001600160401b0382111561553e575f80fd5b6020019150600581901b360382131561373f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261557d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155bd576155bd615587565b60405290565b604080519081016001600160401b03811182821017156155bd576155bd615587565b604051601f8201601f191681016001600160401b038111828210171561560d5761560d615587565b604052919050565b5f6001600160401b0382111561562d5761562d615587565b50601f01601f191660200190565b5f82601f83011261564a575f80fd5b813561565d61565882615615565b6155e5565b818152846020838601011115615671575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561569d575f80fd5b6156a561559b565b82356001600160401b03808211156156bb575f80fd5b6156c73683870161563b565b835260208501359150808211156156dc575f80fd5b506156e93682860161563b565b6020830152506156fb604084016151f8565b604082015292915050565b5f825161557d8184602087016152fc565b601f8211156104d857805f5260205f20601f840160051c8101602085101561573c5750805b601f840160051c820191505b8181101561166b575f8155600101615748565b81516001600160401b0381111561577457615774615587565b615788816157828454615486565b84615717565b602080601f8311600181146157bb575f84156157a45750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b828110156157e9578886015182559484019460019091019084016157ca565b508582101561580657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c66615816565b5f63ffffffff80831681810361585557615855615816565b6001019392505050565b5f8261587957634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615892576158926152d4565b91905290565b8082028115828204841417610c6657610c66615816565b5f60208083525f84546158c181615486565b806020870152604060018084165f81146158e257600181146158fe5761592b565b60ff19851660408a0152604084151560051b8a0101955061592b565b895f5260205f205f5b858110156159225781548b8201860152908301908801615907565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611eee57611eee615816565b6001600160401b03828116828216039080821115611eee57611eee615816565b8051615108816150e8565b5f80604083850312156159a4575f80fd5b82516001600160401b03808211156159ba575f80fd5b90840190606082870312156159cd575f80fd5b6159d561559b565b825181526020808401516159e8816153c9565b828201526040840151838111156159fd575f80fd5b80850194505087601f850112615a11575f80fd5b83519250615a2161565884615615565b8381528882858701011115615a34575f80fd5b615a43848383018488016152fc565b80604084015250819550615a58818801615988565b9450505050509250929050565b81810381811115610c6657610c66615816565b5f808335601e19843603018112615a8d575f80fd5b8301803591506001600160401b03821115615aa6575f80fd5b60200191503681900382131561373f575f80fd5b5f8851615acb818460208d016152fc565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b4657615b46615816565b505092915050565b5f8235603e1983360301811261557d575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ba0575f80fd5b615ba86155c3565b615bb1836150f5565b81526020808401356001600160401b0380821115615bcd575f80fd5b9085019036601f830112615bdf575f80fd5b813581811115615bf157615bf1615587565b8060051b9150615c028483016155e5565b8181529183018401918481019036841115615c1b575f80fd5b938501935b83851015615c455784359250615c35836153c9565b8282529385019390850190615c20565b94860194909452509295945050505050565b5f60208284031215615c67575f80fd5b611d89826151e7565b5f60208284031215615c80575f80fd5b813560ff81168114611d89575f80fd5b5f6001600160401b0380831681810361585557615855615816565b5f60208284031215615cbb575f80fd5b8151611d89816150e8565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d0c81602a850160208b016152fc565b865190830190615d2381602a840160208b016152fc565b60c087901b6001600160c01b031916602a9290910191820152615d55603282018660e01b6001600160e01b0319169052565b615d6e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615d918184602088016152fc565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615dc78184602089016152fc565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e028184602088016152fc565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161603c38038061603c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615eef8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b61020961020436600461510d565b6104a8565b005b610209610219366004615148565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b36600461510d565b6106eb565b61020961025e36600461515f565b6106f6565b6102096102713660046151ad565b610be2565b610289610284366004615148565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb36600461510d565b610c6c565b6102096102de3660046151ce565b610c77565b6102f66102f136600461520e565b610d39565b604051908152602001610234565b610209610312366004615273565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f661034236600461529b565b610fd9565b610289610355366004615148565b610ff2565b6102f65f81565b61020961036f36600461510d565b611006565b610226603081565b61020961038a366004615148565b611031565b61020961039d366004615273565b6110fc565b6102f66103b03660046152b4565b6112d4565b6102096103c33660046151ce565b611300565b6102f65f80516020615e6383398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004615148565b611489565b6102f65f80516020615e8383398151915281565b610209610437366004615148565b611672565b610226601481565b610457610452366004615148565b6117af565b6040516102349190615349565b6102896202a30081565b6102f65f80516020615e4383398151915281565b6102096104903660046153dd565b6118fe565b6102f66104a336600461541b565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615ec38339815191526020526040808220815160e0810190925280545f80516020615e8383398151915293929190829060ff16600581111561052a5761052a6152d4565b600581111561053b5761053b6152d4565b815260200160018201805461054f90615486565b80601f016020809104026020016040519081016040528092919081815260200182805461057b90615486565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115610631576106316152d4565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d90565b6040518263ffffffff1660e01b81526004016106a591906154cc565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e591906154de565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615e838339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af91906154de565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e960608501604086016154f5565b6001600160a01b03161461082c5761080760608401604085016154f5565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a6060850185615510565b905090505f805b828163ffffffff161015610b22575f61085d6060880188615510565b8363ffffffff1681811061087357610873615555565b90506020028101906108859190615569565b61088e9061568d565b80516040519192505f9160088801916108a691615706565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf91906004016154cc565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f91615706565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d91906154de565b90508086600801835f01516040516109759190615706565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f76152d4565b021790555060208201516001820190610a10908261575b565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab591168561582a565b8251604051919550610ac691615706565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b9061583d565b9050610841565b50600483018190555f610b40610b3786611ddf565b60400151611ef5565b90505f610b4c87612082565b90505f600282604051610b5f9190615706565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d91906154de565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb8261225c565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c6152d4565b14610c4c578060405163170cc93360e21b81526004016104cf91906154be565b6106e58383612297565b5f610c6664e8d4a510008361585f565b92915050565b6106e5838383612511565b610c7f61270a565b5f80516020615e638339815191525f80610c9884612741565b91509150610ca58261225c565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce06152d4565b03610d05575f83815260078501602052604081208054919055610d038282612a7f565b505b610d1b81610d168460400151610fd9565b612af5565b505050505b610d3660015f80516020615ea383398151915255565b50565b5f610d4261270a565b610d4e85858585612b2b565b9050610d6660015f80516020615ea383398151915255565b949350505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115610dbb57610dbb6152d4565b6003811115610dcc57610dcc6152d4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e596152d4565b14610e7a578251604051633b0d540d60e21b81526104cf919060040161587e565b600481516005811115610e8f57610e8f6152d4565b03610ea557610e9d85612d04565b505050505050565b5f80610ebc610eb389611ddf565b60400151612eeb565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a51000615898565b5f610ffc826117af565b6080015192915050565b611011838383612511565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615e638339815191525f611049836117af565b5190506004816005811115611060576110606152d4565b14611080578060405163170cc93360e21b81526004016104cf91906154be565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a7f565b61110461270a565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115611151576111516152d4565b6003811115611162576111626152d4565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db6152d4565b146111fc578051604051633b0d540d60e21b81526104cf919060040161587e565b600461120b82604001516117af565b51600581111561121d5761121d6152d4565b146112af575f61122c85611ddf565b90505f8061123d8360400151612eeb565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612d04565b50506112d060015f80516020615ea383398151915255565b5050565b5f6112dd61270a565b6112e8833384613141565b9050610c6660015f80516020615ea383398151915255565b5f80516020615e838339815191525f8061132561131c85611ddf565b60400151613419565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f8281526006840160205260409020805461136590615486565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af6152d4565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b5f82815260068401602052604081206113fa9161505c565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff1660038111156114d6576114d66152d4565b60038111156114e7576114e76152d4565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611560576115606152d4565b14158015611581575060038151600381111561157e5761157e6152d4565b14155b156115a2578051604051633b0d540d60e21b81526104cf919060040161587e565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d90565b6040518263ffffffff1660e01b815260040161162b91906154cc565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b91906154de565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615e8383398151915291906116b990615486565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff166005811115611703576117036152d4565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016158af565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906154de565b6117b7615093565b5f8281525f80516020615ec3833981519152602052604090819020815160e0810190925280545f80516020615e83833981519152929190829060ff166005811115611804576118046152d4565b6005811115611815576118156152d4565b815260200160018201805461182990615486565b80601f016020809104026020016040519081016040528092919081815260200182805461185590615486565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561199084846135d5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615e83833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615939565b90815260200160405180910390205491505092915050565b5f8381525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e638339815191529284929091829060ff166003811115611a8657611a866152d4565b6003811115611a9757611a976152d4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b246152d4565b14611b45578251604051633b0d540d60e21b81526104cf919060040161587e565b60208301516001600160a01b03163314611be1575f8281526004850160205260409020546001600160a01b03163314611b7e57336110a1565b5f82815260048501602052604090205460a0820151611bad91600160b01b90046001600160401b031690615948565b6001600160401b0316421015611be15760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b600281516005811115611bf657611bf66152d4565b03611d245760028401546080840151611c18916001600160401b031690615948565b6001600160401b0316421015611c4c5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b8615611c5e57611c5c8287612297565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c97918491611c929190615968565b6135ef565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611cd884613746565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d899350505050565b600481516005811115611d3957611d396152d4565b03611d6d57611d4783613746565b5f898152600686016020526040902055611d6088612d04565b6001945050505050611d89565b805160405163170cc93360e21b81526104cf91906004016154be565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e6a9190810190615993565b9150915080611e8c57604051636b2f19e960e01b815260040160405180910390fd5b815115611eb2578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611eee576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611f2a57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f7957611f41816001615a65565b611f4c906008615898565b61ffff16848281518110611f6257611f62615555565b016020015160f81c901b9190911790600101611f2d565b5061ffff811615611fa35760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611ffe57611fba816003615a65565b611fc5906008615898565b63ffffffff1685611fd783600261582a565b81518110611fe757611fe7615555565b016020015160f81c901b9190911790600101611fa6565b5063ffffffff81161561202457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120795761203b81601f615a65565b612046906008615898565b8661205283600661582a565b8151811061206257612062615555565b016020015160f81c901b9190911790600101612027565b50949350505050565b60605f8083356020850135601461209e878701604089016154f5565b6120ab6060890189615510565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121316060850185615510565b9050811015611eee57816121486060860186615510565b8381811061215857612158615555565b905060200281019061216a9190615569565b6121749080615a78565b90506121836060870187615510565b8481811061219357612193615555565b90506020028101906121a59190615569565b6121af9080615a78565b6121bc6060890189615510565b868181106121cc576121cc615555565b90506020028101906121de9190615569565b6121ec906020810190615a78565b6121f960608b018b615510565b8881811061220957612209615555565b905060200281019061221b9190615569565b61222c90606081019060400161529b565b6040516020016122429796959493929190615aba565b60408051601f198184030181529190529150600101612124565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122e2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123099190810190615993565b915091508061232b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561236e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061239291906154de565b8251146123b8578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123f4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f8061240384604001516138f2565b9150915081871461242a5760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615e63833981519152906001600160401b0390811690831611156124e7575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612506565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e638339815191528161252a86613ae3565b90506125358661225c565b61254457600192505050611d89565b5f8681526004830160205260409020546001600160a01b0316331461256957336110a1565b5f86815260048301602052604090205460a082015161259891600160b01b90046001600160401b031690615948565b6001600160401b03168160c001516001600160401b031610156125df5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125f7576125f08786612297565b9050612615565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061263a90610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156126b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d491906154de565b905080846007015f8a81526020019081526020015f205f8282546126f8919061582a565b90915550501515979650505050505050565b5f80516020615ea383398151915280546001190161273b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61274a615093565b5f80516020615e838339815191525f8061276661131c87611ddf565b91509150801561278d57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127be576127be6152d4565b60058111156127cf576127cf6152d4565b81526020016001820180546127e390615486565b80601f016020809104026020016040519081016040528092919081815260200182805461280f90615486565b801561285a5780601f106128315761010080835404028352916020019161285a565b820191905f5260205f20905b81548152906001019060200180831161283d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128c5576128c56152d4565b141580156128e657506001815160058111156128e3576128e36152d4565b14155b1561290757805160405163170cc93360e21b81526104cf91906004016154be565b60038151600581111561291c5761291c6152d4565b0361292a576004815261292f565b600581525b8360080181602001516040516129459190615706565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612989576129896152d4565b0217905550602082015160018201906129a2908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a4857612a486152d4565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e4383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ada575f80fd5b505af1158015612aec573d5f803e3d5ffd5b50505050505050565b5f80516020615e43833981519152546112d0906001600160a01b03168383613dc7565b60015f80516020615ea383398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e6383398151915290600160401b900461ffff9081169086161080612b7f575061271061ffff8616115b15612ba357604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612bdf576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612bf15750806001015483115b15612c125760405163222d164360e21b8152600481018490526024016104cf565b5f612c1c84613e26565b90505f612c2882610c56565b90505f612c358983613e49565b90506040518060800160405280612c493390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615e238339815191526020526040808220815160e0810190925280545f80516020615e6383398151915293929190829060ff166003811115612d5157612d516152d4565b6003811115612d6257612d626152d4565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e90575f84815260048701602052604090205461271090612e4290600160a01b900461ffff1685615898565b612e4c919061585f565b915081866007015f8681526020019081526020015f205f828254612e70919061582a565b90915550612e8090508284615a65565b9050612e90856020015182612a7f565b612ea58560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f2257835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f7157612f39816001615a65565b612f44906008615898565b61ffff16868281518110612f5a57612f5a615555565b016020015160f81c901b9190911790600101612f25565b5061ffff811615612f9b5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612ff657612fb2816003615a65565b612fbd906008615898565b63ffffffff1687612fcf83600261582a565b81518110612fdf57612fdf615555565b016020015160f81c901b9190911790600101612f9e565b5063ffffffff811660031461301e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130735761303581601f615a65565b613040906008615898565b8861304c83600661582a565b8151811061305c5761305c615555565b016020015160f81c901b9190911790600101613021565b505f805b60088110156130d25761308b816007615a65565b613096906008615898565b6001600160401b0316896130ab83602661582a565b815181106130bb576130bb615555565b016020015160f81c901b9190911790600101613077565b505f805b6008811015613131576130ea816007615a65565b6130f5906008615898565b6001600160401b03168a61310a83602e61582a565b8151811061311a5761311a615555565b016020015160f81c901b91909117906001016130d6565b5091989097509095509350505050565b5f5f80516020615e638339815191528161315d61028485613e26565b90505f613169876117af565b90506131748761225c565b613194576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156131a9576131a96152d4565b146131ca57805160405163170cc93360e21b81526104cf91906004016154be565b5f8282608001516131db9190615948565b905083600201600a9054906101000a90046001600160401b031682604001516132049190615b23565b6001600160401b0316816001600160401b0316111561324157604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f8061324d8a846135ef565b915091505f8a8360405160200161327b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561330e5761330e6152d4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461344f57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b600281101561349e57613466816001615a65565b613471906008615898565b61ffff1685828151811061348757613487615555565b016020015160f81c901b9190911790600101613452565b5061ffff8116156134c85760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613523576134df816003615a65565b6134ea906008615898565b63ffffffff16866134fc83600261582a565b8151811061350c5761350c615555565b016020015160f81c901b91909117906001016134cb565b5063ffffffff811660021461354b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135a05761356281601f615a65565b61356d906008615898565b8761357983600661582a565b8151811061358957613589615555565b016020015160f81c901b919091179060010161354e565b505f866026815181106135b5576135b5615555565b016020015191976001600160f81b03199092161515965090945050505050565b6135dd6143c1565b6135e68261440c565b6112d08161447a565b5f8281525f80516020615ec3833981519152602052604081206002015481905f80516020615e8383398151915290600160801b90046001600160401b031661363785826144e2565b5f613641876146bc565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136918a858b611d90565b6040518263ffffffff1660e01b81526004016136ad91906154cc565b6020604051808303815f875af11580156136c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136ed91906154de565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e6383398151915290505f61376684604001516117af565b90505f60038251600581111561377e5761377e6152d4565b148061379c575060048251600581111561379a5761379a6152d4565b145b156137ac575060c08101516137e9565b6002825160058111156137c1576137c16152d4565b036137cd5750426137e9565b815160405163170cc93360e21b81526104cf91906004016154be565b84608001516001600160401b0316816001600160401b03161161381057505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061383590610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156138c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138e991906154de565b95945050505050565b5f808251602e1461392857825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b60028110156139775761393f816001615a65565b61394a906008615898565b61ffff1685828151811061396057613960615555565b016020015160f81c901b919091179060010161392b565b5061ffff8116156139a15760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139fc576139b8816003615a65565b6139c3906008615898565b63ffffffff16866139d583600261582a565b815181106139e5576139e5615555565b016020015160f81c901b91909117906001016139a4565b5063ffffffff811615613a2257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a7757613a3981601f615a65565b613a44906008615898565b87613a5083600661582a565b81518110613a6057613a60615555565b016020015160f81c901b9190911790600101613a25565b505f805b6008811015613ad657613a8f816007615a65565b613a9a906008615898565b6001600160401b031688613aaf83602661582a565b81518110613abf57613abf615555565b016020015160f81c901b9190911790600101613a7b565b5090969095509350505050565b613aeb615093565b5f8281525f80516020615ec38339815191526020526040808220815160e0810190925280545f80516020615e8383398151915293929190829060ff166005811115613b3857613b386152d4565b6005811115613b4957613b496152d4565b8152602001600182018054613b5d90615486565b80601f0160208091040260200160405190810160405280929190818152602001828054613b8990615486565b8015613bd45780601f10613bab57610100808354040283529160200191613bd4565b820191905f5260205f20905b815481529060010190602001808311613bb757829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c4257613c426152d4565b14613c75575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016154be565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cb957613cb96152d4565b021790555060208201516001820190613cd2908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d7085826135ef565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614731565b5f610c66825f80516020615e43833981519152546001600160a01b031690614792565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e8d57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615e8383398151915242613eac606086016040870161529b565b6001600160401b0316111580613ee65750613eca6202a3004261582a565b613eda606086016040870161529b565b6001600160401b031610155b15613f2057613efb606085016040860161529b565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613f35613f306060860186615b4e565b6148eb565b613f45613f306080860186615b4e565b6030613f546020860186615a78565b905014613f8657613f686020850185615a78565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f908480615a78565b90505f03613fbd57613fa28480615a78565b604051633e08a12560e11b81526004016104cf929190615b62565b5f60088201613fcc8680615a78565b604051613fda929190615939565b9081526020016040518091039020541461401357613ff88480615a78565b60405163a41f772f60e01b81526004016104cf929190615b62565b61401d835f6144e2565b6040805160e08101909152815481525f90819061412990602081016140428980615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061408a908a018a615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140d360608a0160408b0161529b565b6001600160401b031681526020016140ee60608a018a615b4e565b6140f790615b90565b815260200161410960808a018a615b4e565b61411290615b90565b8152602001876001600160401b0316815250614a54565b5f82815260068601602052604090209193509150614147828261575b565b5081600884016141578880615a78565b604051614165929190615939565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141a19085906004016154cc565b6020604051808303815f875af11580156141bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141e191906154de565b6040805160e0810190915290915080600181526020016142018980615a78565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115614290576142906152d4565b0217905550602082015160018201906142a9908261575b565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143478880615a78565b604051614355929190615939565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614393919061529b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661440a57604051631afcd79f60e31b815260040160405180910390fd5b565b6144146143c1565b61441d81614c41565b614425614c5a565b610d366060820135608083013561444260c0850160a0860161529b565b61445260e0860160c08701615c57565b614463610100870160e08801615c70565b614475610120880161010089016154f5565b614c6a565b6144826143c1565b5f80516020615e438339815191526001600160a01b0382166144c257604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615e838339815191525f6001600160401b0380841690851611156145165761450f8385615968565b9050614523565b6145208484615968565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614585575060018401548151614581916001600160401b03169061582a565b8210155b156145ab576001600160401b0383166060820152818152604081015160208201526145ca565b82816060018181516145bd9190615948565b6001600160401b03169052505b60608101516145da906064615b23565b602082015160018601546001600160401b0392909216916146059190600160401b900460ff16615898565b101561463557606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b031681604001818151614650919061582a565b9052506040810180516001600160401b0387169190614670908390615a65565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615ec38339815191526020526040812060020180545f80516020615e83833981519152919060089061470690600160401b90046001600160401b0316615c90565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147456001600160a01b03841683614e00565b905080515f141580156147695750808060200190518101906147679190615cab565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156147d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147fc91906154de565b90506148136001600160a01b038516333086614e0d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614857573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061487b91906154de565b90508181116148e15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b6138e98282615a65565b6148f860208201826151ce565b63ffffffff1615801561491857506149136020820182615510565b151590505b1561495f5761492a60208201826151ce565b6149376020830183615510565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b61496c6020820182615510565b905061497b60208301836151ce565b63ffffffff1611156149945761492a60208201826151ce565b60015b6149a46020830183615510565b90508110156112d0576149ba6020830183615510565b6149c5600184615a65565b8181106149d4576149d4615555565b90506020020160208101906149e991906154f5565b6001600160a01b03166149ff6020840184615510565b83818110614a0f57614a0f615555565b9050602002016020810190614a2491906154f5565b6001600160a01b03161015614a4c57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614997565b5f6060826040015151603014614a7d5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614abe988a986001989297929690959094909390929101615cc6565b60405160208183030381529060405290505f5b84608001516020015151811015614b3057818560800151602001518281518110614afd57614afd615555565b6020026020010151604051602001614b16929190615d80565b60408051601f198184030181529190529150600101614ad1565b5060a0840151805160209182015151604051614b50938593929101615db6565b60405160208183030381529060405290505f5b8460a001516020015151811015614bc257818560a00151602001518281518110614b8f57614b8f615555565b6020026020010151604051602001614ba8929190615d80565b60408051601f198184030181529190529150600101614b63565b5060c0840151604051614bd9918391602001615df1565b6040516020818303038152906040529050600281604051614bfa9190615706565b602060405180830381855afa158015614c15573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c3891906154de565b94909350915050565b614c496143c1565b614c51614e46565b610d3681614e4e565b614c626143c1565b61440a614f36565b614c726143c1565b5f80516020615e6383398151915261ffff84161580614c96575061271061ffff8516115b15614cba57604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614cde5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614cf15750600a60ff8416115b15614d145760405163170db35960e31b815260ff841660048201526024016104cf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316856001600160401b03161015614d7b576040516202a06d60e11b81526001600160401b03861660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d8983835f614f3e565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613df4565b61440a6143c1565b614e566143c1565b80355f80516020615e838339815191529081556014614e7b6060840160408501615c70565b60ff161180614e9a5750614e956060830160408401615c70565b60ff16155b15614ece57614eaf6060830160408401615c70565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614ede6060830160408401615c70565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f0f604083016020840161529b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b186143c1565b606081471015614f635760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614f7e9190615706565b5f6040518083038185875af1925050503d805f8114614fb8576040519150601f19603f3d011682016040523d82523d5f602084013e614fbd565b606091505b5091509150614fcd868383614fd7565b9695505050505050565b606082614fec57614fe782615033565b611d89565b815115801561500357506001600160a01b0384163b155b1561502c57604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d89565b8051156150435780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461506890615486565b5f825580601f10615077575050565b601f0160209004905f5260205f2090810190610d3691906150d0565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156150e4575f81556001016150d1565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114615108575f80fd5b919050565b5f805f6060848603121561511f575f80fd5b833592506020840135615131816150e8565b915061513f604085016150f5565b90509250925092565b5f60208284031215615158575f80fd5b5035919050565b5f8060408385031215615170575f80fd5b82356001600160401b03811115615185575f80fd5b830160808186031215615196575f80fd5b91506151a4602084016150f5565b90509250929050565b5f80604083850312156151be575f80fd5b823591506151a4602084016150f5565b5f602082840312156151de575f80fd5b611d89826150f5565b803561ffff81168114615108575f80fd5b80356001600160401b0381168114615108575f80fd5b5f805f8060808587031215615221575f80fd5b84356001600160401b03811115615236575f80fd5b850160a08188031215615247575f80fd5b9350615255602086016151e7565b9250615263604086016151f8565b9396929550929360600135925050565b5f8060408385031215615284575f80fd5b61528d836150f5565b946020939093013593505050565b5f602082840312156152ab575f80fd5b611d89826151f8565b5f80604083850312156152c5575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106152f8576152f86152d4565b9052565b5f5b838110156153165781810151838201526020016152fe565b50505f910152565b5f81518084526153358160208601602086016152fc565b601f01601f19169290920160200192915050565b6020815261535b6020820183516152e8565b5f602083015160e0604084015261537661010084018261531e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f808284036101408112156153f0575f80fd5b610120808212156153ff575f80fd5b8493508301359050615410816153c9565b809150509250929050565b5f806020838503121561542c575f80fd5b82356001600160401b0380821115615442575f80fd5b818501915085601f830112615455575f80fd5b813581811115615463575f80fd5b866020828501011115615474575f80fd5b60209290920196919550909350505050565b600181811c9082168061549a57607f821691505b6020821081036154b857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c6682846152e8565b602081525f611d89602083018461531e565b5f602082840312156154ee575f80fd5b5051919050565b5f60208284031215615505575f80fd5b8135611d89816153c9565b5f808335601e19843603018112615525575f80fd5b8301803591506001600160401b0382111561553e575f80fd5b6020019150600581901b360382131561373f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261557d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155bd576155bd615587565b60405290565b604080519081016001600160401b03811182821017156155bd576155bd615587565b604051601f8201601f191681016001600160401b038111828210171561560d5761560d615587565b604052919050565b5f6001600160401b0382111561562d5761562d615587565b50601f01601f191660200190565b5f82601f83011261564a575f80fd5b813561565d61565882615615565b6155e5565b818152846020838601011115615671575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561569d575f80fd5b6156a561559b565b82356001600160401b03808211156156bb575f80fd5b6156c73683870161563b565b835260208501359150808211156156dc575f80fd5b506156e93682860161563b565b6020830152506156fb604084016151f8565b604082015292915050565b5f825161557d8184602087016152fc565b601f8211156104d857805f5260205f20601f840160051c8101602085101561573c5750805b601f840160051c820191505b8181101561166b575f8155600101615748565b81516001600160401b0381111561577457615774615587565b615788816157828454615486565b84615717565b602080601f8311600181146157bb575f84156157a45750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b828110156157e9578886015182559484019460019091019084016157ca565b508582101561580657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c66615816565b5f63ffffffff80831681810361585557615855615816565b6001019392505050565b5f8261587957634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615892576158926152d4565b91905290565b8082028115828204841417610c6657610c66615816565b5f60208083525f84546158c181615486565b806020870152604060018084165f81146158e257600181146158fe5761592b565b60ff19851660408a0152604084151560051b8a0101955061592b565b895f5260205f205f5b858110156159225781548b8201860152908301908801615907565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611eee57611eee615816565b6001600160401b03828116828216039080821115611eee57611eee615816565b8051615108816150e8565b5f80604083850312156159a4575f80fd5b82516001600160401b03808211156159ba575f80fd5b90840190606082870312156159cd575f80fd5b6159d561559b565b825181526020808401516159e8816153c9565b828201526040840151838111156159fd575f80fd5b80850194505087601f850112615a11575f80fd5b83519250615a2161565884615615565b8381528882858701011115615a34575f80fd5b615a43848383018488016152fc565b80604084015250819550615a58818801615988565b9450505050509250929050565b81810381811115610c6657610c66615816565b5f808335601e19843603018112615a8d575f80fd5b8301803591506001600160401b03821115615aa6575f80fd5b60200191503681900382131561373f575f80fd5b5f8851615acb818460208d016152fc565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b4657615b46615816565b505092915050565b5f8235603e1983360301811261557d575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ba0575f80fd5b615ba86155c3565b615bb1836150f5565b81526020808401356001600160401b0380821115615bcd575f80fd5b9085019036601f830112615bdf575f80fd5b813581811115615bf157615bf1615587565b8060051b9150615c028483016155e5565b8181529183018401918481019036841115615c1b575f80fd5b938501935b83851015615c455784359250615c35836153c9565b8282529385019390850190615c20565b94860194909452509295945050505050565b5f60208284031215615c67575f80fd5b611d89826151e7565b5f60208284031215615c80575f80fd5b813560ff81168114611d89575f80fd5b5f6001600160401b0380831681810361585557615855615816565b5f60208284031215615cbb575f80fd5b8151611d89816150e8565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d0c81602a850160208b016152fc565b865190830190615d2381602a840160208b016152fc565b60c087901b6001600160c01b031916602a9290910191820152615d55603282018660e01b6001600160e01b0319169052565b615d6e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615d918184602088016152fc565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615dc78184602089016152fc565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e028184602088016152fc565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 9dca454c5..ab987d699 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -91,7 +91,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d47380380615d4783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615bfa8061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614eb1565b61060a565b005b348015610216575f80fd5b50610209610225366004614eec565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614eb1565b61084d565b34801561027f575f80fd5b5061020961028e366004614f03565b610858565b34801561029e575f80fd5b506102096102ad366004614f51565b610d44565b3480156102bd575f80fd5b506102096102cc366004614f68565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614eec565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614eb1565b610eab565b34801561038c575f80fd5b5061020961039b366004614f89565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614fa2565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614fe0565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614eec565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614eb1565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614eec565b61123b565b3480156104a4575f80fd5b506102096104b3366004614fa2565b611306565b3480156104c3575f80fd5b506102096104d2366004614f89565b6114de565b6104076104e536600461500a565b611667565b3480156104f5575f80fd5b506104075f80516020615b6e83398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614eec565b61169b565b34801561054e575f80fd5b506104075f80516020615b8e83398151915281565b34801561056e575f80fd5b5061020961057d366004614eec565b611884565b610407610590366004614eec565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614eec565b6119f2565b60405161024c91906150d3565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004615153565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615bce8339815191526020526040808220815160e0810190925280545f80516020615b8e83398151915293929190829060ff16600581111561068c5761068c61505e565b600581111561069d5761069d61505e565b81526020016001820180546106b1906151be565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd906151be565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156107935761079361505e565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611eed565b6040518263ffffffff1660e01b815260040161080791906151fe565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108479190615210565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615b8e8339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109119190615210565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161523b565b6001600160a01b03161461098e57610969606084016040850161523b565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c6060850185615256565b905090505f805b828163ffffffff161015610c84575f6109bf6060880188615256565b8363ffffffff168181106109d5576109d561529b565b90506020028101906109e791906152af565b6109f0906153d3565b80516040519192505f916008880191610a089161544c565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b815261063191906004016151fe565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a819161544c565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf9190615210565b90508086600801835f0151604051610ad7919061544c565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b5961505e565b021790555060208201516001820190610b7290826154a1565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615570565b8251604051919550610c289161544c565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d90615583565b90506109a3565b50600483018190555f610ca2610c9986611f3c565b60400151612052565b90505f610cae876121df565b90505f600282604051610cc1919061544c565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff9190615210565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd5836123b9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a826123ca565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b61505e565b14610e8b578060405163170cc93360e21b815260040161063191906151f0565b6108478383612405565b5f610ea564e8d4a51000836155a5565b92915050565b61084783838361267f565b610ebe612878565b5f80516020615b6e8339815191525f80610ed7846128af565b91509150610ee4826123ca565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f61505e565b03610f44575f83815260078501602052604081208054919055610f428282612bed565b505b610f5a81610f5584604001516111e3565b612c4b565b505050505b610f7560015f80516020615bae83398151915255565b50565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff166003811115610fc557610fc561505e565b6003811115610fd657610fd661505e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b90506001835160038111156110635761106361505e565b14611084578251604051633b0d540d60e21b815261063191906004016155c4565b6004815160058111156110995761109961505e565b036110af576110a785612c71565b505050505050565b5f806110c66110bd89611f3c565b60400151612e58565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a510006155de565b5f611206826119f2565b6080015192915050565b61121b83838361267f565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615b6e8339815191525f611253836119f2565b519050600481600581111561126a5761126a61505e565b1461128a578060405163170cc93360e21b815260040161063191906151f0565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612bed565b61130e612878565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff16600381111561135b5761135b61505e565b600381111561136c5761136c61505e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e561505e565b14611406578051604051633b0d540d60e21b815261063191906004016155c4565b600461141582604001516119f2565b5160058111156114275761142761505e565b146114b9575f61143685611f3c565b90505f806114478360400151612e58565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c71565b50506114da60015f80516020615bae83398151915255565b5050565b5f80516020615b8e8339815191525f806115036114fa85611f3c565b604001516130ae565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f82815260068401602052604090208054611543906151be565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d61505e565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b5f82815260068401602052604081206115d891614e05565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611670612878565b61167c8484843461326a565b905061169460015f80516020615bae83398151915255565b9392505050565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff1660038111156116e8576116e861505e565b60038111156116f9576116f961505e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117725761177261505e565b1415801561179357506003815160038111156117905761179061505e565b14155b156117b4578051604051633b0d540d60e21b815261063191906004016155c4565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611eed565b6040518263ffffffff1660e01b815260040161183d91906151fe565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d9190615210565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615b8e83398151915291906118cb906151be565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff1660058111156119155761191561505e565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161198191906004016155f5565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190615210565b5f6119ca612878565b6119d5823334613438565b90506119ed60015f80516020615bae83398151915255565b919050565b6119fa614e3c565b5f8281525f80516020615bce833981519152602052604090819020815160e0810190925280545f80516020615b8e833981519152929190829060ff166005811115611a4757611a4761505e565b6005811115611a5857611a5861505e565b8152602001600182018054611a6c906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054611a98906151be565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615b8e833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b84908690869061567f565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e8339815191529284929091829060ff166003811115611bea57611bea61505e565b6003811115611bfb57611bfb61505e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c8861505e565b14611ca9578251604051633b0d540d60e21b815261063191906004016155c4565b60028401546080840151611cc6916001600160401b03169061568e565b6001600160401b0316421015611cfa5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b60208301516001600160a01b03163314611d96575f8281526004850160205260409020546001600160a01b03163314611d3357336112ab565b5f82815260048501602052604090205460a0820151611d6291600160b01b90046001600160401b03169061568e565b6001600160401b0316421015611d965760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b600281516005811115611dab57611dab61505e565b03611e88578615611dc257611dc08287612405565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611dfb918491611df691906156ae565b61370d565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e3c84613864565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e9d57611e9d61505e565b03611ed157611eab83613864565b5f898152600686016020526040902055611ec488612c71565b6001945050505050611694565b805160405163170cc93360e21b815261063191906004016151f0565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fa0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fc791908101906156d9565b9150915080611fe957604051636b2f19e960e01b815260040160405180910390fd5b81511561200f578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561204b576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461208757815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b60028110156120d65761209e8160016157ab565b6120a99060086155de565b61ffff168482815181106120bf576120bf61529b565b016020015160f81c901b919091179060010161208a565b5061ffff8116156121005760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561215b576121178160036157ab565b6121229060086155de565b63ffffffff1685612134836002615570565b815181106121445761214461529b565b016020015160f81c901b9190911790600101612103565b5063ffffffff81161561218157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121d65761219881601f6157ab565b6121a39060086155de565b866121af836006615570565b815181106121bf576121bf61529b565b016020015160f81c901b9190911790600101612184565b50949350505050565b60605f808335602085013560146121fb8787016040890161523b565b6122086060890189615256565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61228e6060850185615256565b905081101561204b57816122a56060860186615256565b838181106122b5576122b561529b565b90506020028101906122c791906152af565b6122d190806157be565b90506122e06060870187615256565b848181106122f0576122f061529b565b905060200281019061230291906152af565b61230c90806157be565b6123196060890189615256565b868181106123295761232961529b565b905060200281019061233b91906152af565b6123499060208101906157be565b61235660608b018b615256565b888181106123665761236661529b565b905060200281019061237891906152af565b612389906060810190604001614fe0565b60405160200161239f9796959493929190615800565b60408051601f198184030181529190529150600101612281565b6123c1613a10565b610f7581613a5b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261247791908101906156d9565b915091508061249957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125009190615210565b825114612526578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612562576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125718460400151613ac9565b915091508187146125985760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615b6e833981519152906001600160401b039081169083161115612655575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612674565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b6e8339815191528161269886613cba565b90506126a3866123ca565b6126b257600192505050611694565b5f8681526004830160205260409020546001600160a01b031633146126d757336112ab565b5f86815260048301602052604090205460a082015161270691600160b01b90046001600160401b03169061568e565b6001600160401b03168160c001516001600160401b0316101561274d5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156127655761275e8786612405565b9050612783565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906127a8906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561281e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128429190615210565b905080846007015f8a81526020019081526020015f205f8282546128669190615570565b90915550501515979650505050505050565b5f80516020615bae8339815191528054600119016128a957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128b8614e3c565b5f80516020615b8e8339815191525f806128d46114fa87611f3c565b9150915080156128fb57604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561292c5761292c61505e565b600581111561293d5761293d61505e565b8152602001600182018054612951906151be565b80601f016020809104026020016040519081016040528092919081815260200182805461297d906151be565b80156129c85780601f1061299f576101008083540402835291602001916129c8565b820191905f5260205f20905b8154815290600101906020018083116129ab57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a3357612a3361505e565b14158015612a545750600181516005811115612a5157612a5161505e565b14155b15612a7557805160405163170cc93360e21b815261063191906004016151f0565b600381516005811115612a8a57612a8a61505e565b03612a985760048152612a9d565b600581525b836008018160200151604051612ab3919061544c565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612af757612af761505e565b021790555060208201516001820190612b1090826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bb657612bb661505e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c39575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f9e565b60015f80516020615bae83398151915255565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff166003811115612cbe57612cbe61505e565b6003811115612ccf57612ccf61505e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dfd575f84815260048701602052604090205461271090612daf90600160a01b900461ffff16856155de565b612db991906155a5565b915081866007015f8681526020019081526020015f205f828254612ddd9190615570565b90915550612ded905082846157ab565b9050612dfd856020015182612bed565b612e128560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e8f57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612ede57612ea68160016157ab565b612eb19060086155de565b61ffff16868281518110612ec757612ec761529b565b016020015160f81c901b9190911790600101612e92565b5061ffff811615612f085760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f6357612f1f8160036157ab565b612f2a9060086155de565b63ffffffff1687612f3c836002615570565b81518110612f4c57612f4c61529b565b016020015160f81c901b9190911790600101612f0b565b5063ffffffff8116600314612f8b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fe057612fa281601f6157ab565b612fad9060086155de565b88612fb9836006615570565b81518110612fc957612fc961529b565b016020015160f81c901b9190911790600101612f8e565b505f805b600881101561303f57612ff88160076157ab565b6130039060086155de565b6001600160401b031689613018836026615570565b815181106130285761302861529b565b016020015160f81c901b9190911790600101612fe4565b505f805b600881101561309e576130578160076157ab565b6130629060086155de565b6001600160401b03168a61307783602e615570565b815181106130875761308761529b565b016020015160f81c901b9190911790600101613043565b5091989097509095509350505050565b5f8082516027146130e457825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b6002811015613133576130fb8160016157ab565b6131069060086155de565b61ffff1685828151811061311c5761311c61529b565b016020015160f81c901b91909117906001016130e7565b5061ffff81161561315d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156131b8576131748160036157ab565b61317f9060086155de565b63ffffffff1686613191836002615570565b815181106131a1576131a161529b565b016020015160f81c901b9190911790600101613160565b5063ffffffff81166002146131e057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613235576131f781601f6157ab565b6132029060086155de565b8761320e836006615570565b8151811061321e5761321e61529b565b016020015160f81c901b91909117906001016131e3565b505f8660268151811061324a5761324a61529b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b6e83398151915290600160401b900461ffff90811690861610806132be575061271061ffff8616115b156132e257604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b03908116908516101561331e576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806133305750806001015483115b156133515760405163222d164360e21b815260048101849052602401610631565b825f61335c82610e95565b90505f6133698983614031565b9050604051806080016040528061337d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615b6e8339815191528161345184610e95565b90505f61345d876119f2565b9050613468876123ca565b613488576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561349d5761349d61505e565b146134be57805160405163170cc93360e21b815261063191906004016151f0565b5f8282608001516134cf919061568e565b905083600201600a9054906101000a90046001600160401b031682604001516134f89190615869565b6001600160401b0316816001600160401b0316111561353557604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806135418a8461370d565b915091505f8a8360405160200161356f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136025761360261505e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615bce833981519152602052604081206002015481905f80516020615b8e83398151915290600160801b90046001600160401b031661375585826145a9565b5f61375f87614783565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137af8a858b611eed565b6040518263ffffffff1660e01b81526004016137cb91906151fe565b6020604051808303815f875af11580156137e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061380b9190615210565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b6e83398151915290505f61388484604001516119f2565b90505f60038251600581111561389c5761389c61505e565b14806138ba57506004825160058111156138b8576138b861505e565b145b156138ca575060c0810151613907565b6002825160058111156138df576138df61505e565b036138eb575042613907565b815160405163170cc93360e21b815261063191906004016151f0565b84608001516001600160401b0316816001600160401b03161161392e57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613953906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156139e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a079190615210565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a5957604051631afcd79f60e31b815260040160405180910390fd5b565b613a63613a10565b613a6c816147f8565b613a74614811565b610f7560608201356080830135613a9160c0850160a08601614fe0565b613aa160e0860160c08701615894565b613ab2610100870160e088016158ad565b613ac46101208801610100890161523b565b614821565b5f808251602e14613aff57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b4e57613b168160016157ab565b613b219060086155de565b61ffff16858281518110613b3757613b3761529b565b016020015160f81c901b9190911790600101613b02565b5061ffff811615613b785760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613bd357613b8f8160036157ab565b613b9a9060086155de565b63ffffffff1686613bac836002615570565b81518110613bbc57613bbc61529b565b016020015160f81c901b9190911790600101613b7b565b5063ffffffff811615613bf957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c4e57613c1081601f6157ab565b613c1b9060086155de565b87613c27836006615570565b81518110613c3757613c3761529b565b016020015160f81c901b9190911790600101613bfc565b505f805b6008811015613cad57613c668160076157ab565b613c719060086155de565b6001600160401b031688613c86836026615570565b81518110613c9657613c9661529b565b016020015160f81c901b9190911790600101613c52565b5090969095509350505050565b613cc2614e3c565b5f8281525f80516020615bce8339815191526020526040808220815160e0810190925280545f80516020615b8e83398151915293929190829060ff166005811115613d0f57613d0f61505e565b6005811115613d2057613d2061505e565b8152602001600182018054613d34906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054613d60906151be565b8015613dab5780601f10613d8257610100808354040283529160200191613dab565b820191905f5260205f20905b815481529060010190602001808311613d8e57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613e1957613e1961505e565b14613e4c575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e9057613e9061505e565b021790555060208201516001820190613ea990826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f47858261370d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613fc15760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461400a576040519150601f19603f3d011682016040523d82523d5f602084013e61400f565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661407557604051637fab81e560e01b815260040160405180910390fd5b5f80516020615b8e833981519152426140946060860160408701614fe0565b6001600160401b03161115806140ce57506140b26202a30042615570565b6140c26060860160408701614fe0565b6001600160401b031610155b15614108576140e36060850160408601614fe0565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b61411d61411860608601866158cd565b6149b7565b61412d61411860808601866158cd565b603061413c60208601866157be565b90501461416e5761415060208501856157be565b6040516326475b2f60e11b8152610631925060040190815260200190565b61417884806157be565b90505f036141a55761418a84806157be565b604051633e08a12560e11b81526004016106319291906158e1565b5f600882016141b486806157be565b6040516141c292919061567f565b908152602001604051809103902054146141fb576141e084806157be565b60405163a41f772f60e01b81526004016106319291906158e1565b614205835f6145a9565b6040805160e08101909152815481525f908190614311906020810161422a89806157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614272908a018a6157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016142bb60608a0160408b01614fe0565b6001600160401b031681526020016142d660608a018a6158cd565b6142df9061590f565b81526020016142f160808a018a6158cd565b6142fa9061590f565b8152602001876001600160401b0316815250614b20565b5f8281526006860160205260409020919350915061432f82826154a1565b50816008840161433f88806157be565b60405161434d92919061567f565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143899085906004016151fe565b6020604051808303815f875af11580156143a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143c99190615210565b6040805160e0810190915290915080600181526020016143e989806157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156144785761447861505e565b02179055506020820151600182019061449190826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061452f88806157be565b60405161453d92919061567f565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061457b9190614fe0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615b8e8339815191525f6001600160401b0380841690851611156145dd576145d683856156ae565b90506145ea565b6145e784846156ae565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061464c575060018401548151614648916001600160401b031690615570565b8210155b15614672576001600160401b038316606082015281815260408101516020820152614691565b8281606001818151614684919061568e565b6001600160401b03169052505b60608101516146a1906064615869565b602082015160018601546001600160401b0392909216916146cc9190600160401b900460ff166155de565b10156146fc57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516147179190615570565b9052506040810180516001600160401b03871691906147379083906157ab565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bce8339815191526020526040812060020180545f80516020615b8e83398151915291906008906147cd90600160401b90046001600160401b03166159d6565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614800613a10565b614808614d0d565b610f7581614d15565b614819613a10565b613a59614dfd565b614829613a10565b5f80516020615b6e83398151915261ffff8416158061484d575061271061ffff8516115b1561487157604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156148955760405163222d164360e21b815260048101889052602401610631565b60ff831615806148a85750600a60ff8416115b156148cb5760405163170db35960e31b815260ff84166004820152602401610631565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316856001600160401b03161015614932576040516202a06d60e11b81526001600160401b0386166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6149c46020820182614f89565b63ffffffff161580156149e457506149df6020820182615256565b151590505b15614a2b576149f66020820182614f89565b614a036020830183615256565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b614a386020820182615256565b9050614a476020830183614f89565b63ffffffff161115614a60576149f66020820182614f89565b60015b614a706020830183615256565b90508110156114da57614a866020830183615256565b614a916001846157ab565b818110614aa057614aa061529b565b9050602002016020810190614ab5919061523b565b6001600160a01b0316614acb6020840184615256565b83818110614adb57614adb61529b565b9050602002016020810190614af0919061523b565b6001600160a01b03161015614b1857604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a63565b5f6060826040015151603014614b495760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b8a988a9860019892979296909590949093909291016159f1565b60405160208183030381529060405290505f5b84608001516020015151811015614bfc57818560800151602001518281518110614bc957614bc961529b565b6020026020010151604051602001614be2929190615aab565b60408051601f198184030181529190529150600101614b9d565b5060a0840151805160209182015151604051614c1c938593929101615ae1565b60405160208183030381529060405290505f5b8460a001516020015151811015614c8e57818560a00151602001518281518110614c5b57614c5b61529b565b6020026020010151604051602001614c74929190615aab565b60408051601f198184030181529190529150600101614c2f565b5060c0840151604051614ca5918391602001615b1c565b6040516020818303038152906040529050600281604051614cc6919061544c565b602060405180830381855afa158015614ce1573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d049190615210565b94909350915050565b613a59613a10565b614d1d613a10565b80355f80516020615b8e8339815191529081556014614d4260608401604085016158ad565b60ff161180614d615750614d5c60608301604084016158ad565b60ff16155b15614d9557614d7660608301604084016158ad565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614da560608301604084016158ad565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614dd66040830160208401614fe0565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c5e613a10565b508054614e11906151be565b5f825580601f10614e20575050565b601f0160209004905f5260205f2090810190610f759190614e79565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e8d575f8155600101614e7a565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614ec3575f80fd5b833592506020840135614ed581614e91565b9150614ee360408501614e9e565b90509250925092565b5f60208284031215614efc575f80fd5b5035919050565b5f8060408385031215614f14575f80fd5b82356001600160401b03811115614f29575f80fd5b830160808186031215614f3a575f80fd5b9150614f4860208401614e9e565b90509250929050565b5f6101208284031215614f62575f80fd5b50919050565b5f8060408385031215614f79575f80fd5b82359150614f4860208401614e9e565b5f60208284031215614f99575f80fd5b61169482614e9e565b5f8060408385031215614fb3575f80fd5b614fbc83614e9e565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614ff0575f80fd5b61169482614fca565b803561ffff811681146119ed575f80fd5b5f805f6060848603121561501c575f80fd5b83356001600160401b03811115615031575f80fd5b840160a08187031215615042575f80fd5b925061505060208501614ff9565b9150614ee360408501614fca565b634e487b7160e01b5f52602160045260245ffd5b600681106150825761508261505e565b9052565b5f5b838110156150a0578181015183820152602001615088565b50505f910152565b5f81518084526150bf816020860160208601615086565b601f01601f19169290920160200192915050565b602081526150e5602082018351615072565b5f602083015160e060408401526151006101008401826150a8565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615164575f80fd5b82356001600160401b038082111561517a575f80fd5b818501915085601f83011261518d575f80fd5b81358181111561519b575f80fd5b8660208285010111156151ac575f80fd5b60209290920196919550909350505050565b600181811c908216806151d257607f821691505b602082108103614f6257634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284615072565b602081525f61169460208301846150a8565b5f60208284031215615220575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561524b575f80fd5b813561169481615227565b5f808335601e1984360301811261526b575f80fd5b8301803591506001600160401b03821115615284575f80fd5b6020019150600581901b360382131561385d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152c3575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615303576153036152cd565b60405290565b604080519081016001600160401b0381118282101715615303576153036152cd565b604051601f8201601f191681016001600160401b0381118282101715615353576153536152cd565b604052919050565b5f6001600160401b03821115615373576153736152cd565b50601f01601f191660200190565b5f82601f830112615390575f80fd5b81356153a361539e8261535b565b61532b565b8181528460208386010111156153b7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153e3575f80fd5b6153eb6152e1565b82356001600160401b0380821115615401575f80fd5b61540d36838701615381565b83526020850135915080821115615422575f80fd5b5061542f36828601615381565b60208301525061544160408401614fca565b604082015292915050565b5f82516152c3818460208701615086565b601f82111561063a57805f5260205f20601f840160051c810160208510156154825750805b601f840160051c820191505b8181101561187d575f815560010161548e565b81516001600160401b038111156154ba576154ba6152cd565b6154ce816154c884546151be565b8461545d565b602080601f831160018114615501575f84156154ea5750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561552f57888601518255948401946001909101908401615510565b508582101561554c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea561555c565b5f63ffffffff80831681810361559b5761559b61555c565b6001019392505050565b5f826155bf57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155d8576155d861505e565b91905290565b8082028115828204841417610ea557610ea561555c565b5f60208083525f8454615607816151be565b806020870152604060018084165f8114615628576001811461564457615671565b60ff19851660408a0152604084151560051b8a01019550615671565b895f5260205f205f5b858110156156685781548b820186015290830190880161564d565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561204b5761204b61555c565b6001600160401b0382811682821603908082111561204b5761204b61555c565b80516119ed81614e91565b5f80604083850312156156ea575f80fd5b82516001600160401b0380821115615700575f80fd5b9084019060608287031215615713575f80fd5b61571b6152e1565b8251815260208084015161572e81615227565b82820152604084015183811115615743575f80fd5b80850194505087601f850112615757575f80fd5b8351925061576761539e8461535b565b838152888285870101111561577a575f80fd5b61578984838301848801615086565b8060408401525081955061579e8188016156ce565b9450505050509250929050565b81810381811115610ea557610ea561555c565b5f808335601e198436030181126157d3575f80fd5b8301803591506001600160401b038211156157ec575f80fd5b60200191503681900382131561385d575f80fd5b5f8851615811818460208d01615086565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461588c5761588c61555c565b505092915050565b5f602082840312156158a4575f80fd5b61169482614ff9565b5f602082840312156158bd575f80fd5b813560ff81168114611694575f80fd5b5f8235603e198336030181126152c3575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6040823603121561591f575f80fd5b615927615309565b61593083614e9e565b81526020808401356001600160401b038082111561594c575f80fd5b9085019036601f83011261595e575f80fd5b813581811115615970576159706152cd565b8060051b915061598184830161532b565b818152918301840191848101903684111561599a575f80fd5b938501935b838510156159c457843592506159b483615227565b828252938501939085019061599f565b94860194909452509295945050505050565b5f6001600160401b0380831681810361559b5761559b61555c565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a3781602a850160208b01615086565b865190830190615a4e81602a840160208b01615086565b60c087901b6001600160c01b031916602a9290910191820152615a80603282018660e01b6001600160e01b0319169052565b615a99603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615abc818460208801615086565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615af2818460208901615086565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b2d818460208801615086565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d47380380615d4783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615bfa8061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614eb1565b61060a565b005b348015610216575f80fd5b50610209610225366004614eec565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614eb1565b61084d565b34801561027f575f80fd5b5061020961028e366004614f03565b610858565b34801561029e575f80fd5b506102096102ad366004614f51565b610d44565b3480156102bd575f80fd5b506102096102cc366004614f68565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614eec565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614eb1565b610eab565b34801561038c575f80fd5b5061020961039b366004614f89565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614fa2565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614fe0565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614eec565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614eb1565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614eec565b61123b565b3480156104a4575f80fd5b506102096104b3366004614fa2565b611306565b3480156104c3575f80fd5b506102096104d2366004614f89565b6114de565b6104076104e536600461500a565b611667565b3480156104f5575f80fd5b506104075f80516020615b6e83398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614eec565b61169b565b34801561054e575f80fd5b506104075f80516020615b8e83398151915281565b34801561056e575f80fd5b5061020961057d366004614eec565b611884565b610407610590366004614eec565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614eec565b6119f2565b60405161024c91906150d3565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004615153565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615bce8339815191526020526040808220815160e0810190925280545f80516020615b8e83398151915293929190829060ff16600581111561068c5761068c61505e565b600581111561069d5761069d61505e565b81526020016001820180546106b1906151be565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd906151be565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156107935761079361505e565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611eed565b6040518263ffffffff1660e01b815260040161080791906151fe565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108479190615210565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615b8e8339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109119190615210565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161523b565b6001600160a01b03161461098e57610969606084016040850161523b565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c6060850185615256565b905090505f805b828163ffffffff161015610c84575f6109bf6060880188615256565b8363ffffffff168181106109d5576109d561529b565b90506020028101906109e791906152af565b6109f0906153d3565b80516040519192505f916008880191610a089161544c565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b815261063191906004016151fe565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a819161544c565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf9190615210565b90508086600801835f0151604051610ad7919061544c565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b5961505e565b021790555060208201516001820190610b7290826154a1565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615570565b8251604051919550610c289161544c565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d90615583565b90506109a3565b50600483018190555f610ca2610c9986611f3c565b60400151612052565b90505f610cae876121df565b90505f600282604051610cc1919061544c565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff9190615210565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd5836123b9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a826123ca565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b61505e565b14610e8b578060405163170cc93360e21b815260040161063191906151f0565b6108478383612405565b5f610ea564e8d4a51000836155a5565b92915050565b61084783838361267f565b610ebe612878565b5f80516020615b6e8339815191525f80610ed7846128af565b91509150610ee4826123ca565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f61505e565b03610f44575f83815260078501602052604081208054919055610f428282612bed565b505b610f5a81610f5584604001516111e3565b612c4b565b505050505b610f7560015f80516020615bae83398151915255565b50565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff166003811115610fc557610fc561505e565b6003811115610fd657610fd661505e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b90506001835160038111156110635761106361505e565b14611084578251604051633b0d540d60e21b815261063191906004016155c4565b6004815160058111156110995761109961505e565b036110af576110a785612c71565b505050505050565b5f806110c66110bd89611f3c565b60400151612e58565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a510006155de565b5f611206826119f2565b6080015192915050565b61121b83838361267f565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615b6e8339815191525f611253836119f2565b519050600481600581111561126a5761126a61505e565b1461128a578060405163170cc93360e21b815260040161063191906151f0565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612bed565b61130e612878565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff16600381111561135b5761135b61505e565b600381111561136c5761136c61505e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e561505e565b14611406578051604051633b0d540d60e21b815261063191906004016155c4565b600461141582604001516119f2565b5160058111156114275761142761505e565b146114b9575f61143685611f3c565b90505f806114478360400151612e58565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c71565b50506114da60015f80516020615bae83398151915255565b5050565b5f80516020615b8e8339815191525f806115036114fa85611f3c565b604001516130ae565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f82815260068401602052604090208054611543906151be565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d61505e565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b5f82815260068401602052604081206115d891614e05565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611670612878565b61167c8484843461326a565b905061169460015f80516020615bae83398151915255565b9392505050565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff1660038111156116e8576116e861505e565b60038111156116f9576116f961505e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117725761177261505e565b1415801561179357506003815160038111156117905761179061505e565b14155b156117b4578051604051633b0d540d60e21b815261063191906004016155c4565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611eed565b6040518263ffffffff1660e01b815260040161183d91906151fe565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d9190615210565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615b8e83398151915291906118cb906151be565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff1660058111156119155761191561505e565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161198191906004016155f5565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190615210565b5f6119ca612878565b6119d5823334613438565b90506119ed60015f80516020615bae83398151915255565b919050565b6119fa614e3c565b5f8281525f80516020615bce833981519152602052604090819020815160e0810190925280545f80516020615b8e833981519152929190829060ff166005811115611a4757611a4761505e565b6005811115611a5857611a5861505e565b8152602001600182018054611a6c906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054611a98906151be565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615b8e833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b84908690869061567f565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e8339815191529284929091829060ff166003811115611bea57611bea61505e565b6003811115611bfb57611bfb61505e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c8861505e565b14611ca9578251604051633b0d540d60e21b815261063191906004016155c4565b60208301516001600160a01b03163314611d45575f8281526004850160205260409020546001600160a01b03163314611ce257336112ab565b5f82815260048501602052604090205460a0820151611d1191600160b01b90046001600160401b03169061568e565b6001600160401b0316421015611d455760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b600281516005811115611d5a57611d5a61505e565b03611e885760028401546080840151611d7c916001600160401b03169061568e565b6001600160401b0316421015611db05760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b8615611dc257611dc08287612405565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611dfb918491611df691906156ae565b61370d565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e3c84613864565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e9d57611e9d61505e565b03611ed157611eab83613864565b5f898152600686016020526040902055611ec488612c71565b6001945050505050611694565b805160405163170cc93360e21b815261063191906004016151f0565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fa0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fc791908101906156d9565b9150915080611fe957604051636b2f19e960e01b815260040160405180910390fd5b81511561200f578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561204b576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461208757815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b60028110156120d65761209e8160016157ab565b6120a99060086155de565b61ffff168482815181106120bf576120bf61529b565b016020015160f81c901b919091179060010161208a565b5061ffff8116156121005760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561215b576121178160036157ab565b6121229060086155de565b63ffffffff1685612134836002615570565b815181106121445761214461529b565b016020015160f81c901b9190911790600101612103565b5063ffffffff81161561218157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121d65761219881601f6157ab565b6121a39060086155de565b866121af836006615570565b815181106121bf576121bf61529b565b016020015160f81c901b9190911790600101612184565b50949350505050565b60605f808335602085013560146121fb8787016040890161523b565b6122086060890189615256565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61228e6060850185615256565b905081101561204b57816122a56060860186615256565b838181106122b5576122b561529b565b90506020028101906122c791906152af565b6122d190806157be565b90506122e06060870187615256565b848181106122f0576122f061529b565b905060200281019061230291906152af565b61230c90806157be565b6123196060890189615256565b868181106123295761232961529b565b905060200281019061233b91906152af565b6123499060208101906157be565b61235660608b018b615256565b888181106123665761236661529b565b905060200281019061237891906152af565b612389906060810190604001614fe0565b60405160200161239f9796959493929190615800565b60408051601f198184030181529190529150600101612281565b6123c1613a10565b610f7581613a5b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612450573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261247791908101906156d9565b915091508061249957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125009190615210565b825114612526578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612562576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125718460400151613ac9565b915091508187146125985760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615b6e833981519152906001600160401b039081169083161115612655575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612674565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b6e8339815191528161269886613cba565b90506126a3866123ca565b6126b257600192505050611694565b5f8681526004830160205260409020546001600160a01b031633146126d757336112ab565b5f86815260048301602052604090205460a082015161270691600160b01b90046001600160401b03169061568e565b6001600160401b03168160c001516001600160401b0316101561274d5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156127655761275e8786612405565b9050612783565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906127a8906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561281e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128429190615210565b905080846007015f8a81526020019081526020015f205f8282546128669190615570565b90915550501515979650505050505050565b5f80516020615bae8339815191528054600119016128a957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128b8614e3c565b5f80516020615b8e8339815191525f806128d46114fa87611f3c565b9150915080156128fb57604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561292c5761292c61505e565b600581111561293d5761293d61505e565b8152602001600182018054612951906151be565b80601f016020809104026020016040519081016040528092919081815260200182805461297d906151be565b80156129c85780601f1061299f576101008083540402835291602001916129c8565b820191905f5260205f20905b8154815290600101906020018083116129ab57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a3357612a3361505e565b14158015612a545750600181516005811115612a5157612a5161505e565b14155b15612a7557805160405163170cc93360e21b815261063191906004016151f0565b600381516005811115612a8a57612a8a61505e565b03612a985760048152612a9d565b600581525b836008018160200151604051612ab3919061544c565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612af757612af761505e565b021790555060208201516001820190612b1090826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bb657612bb661505e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c39575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f9e565b60015f80516020615bae83398151915255565b5f8181525f80516020615b4e8339815191526020526040808220815160e0810190925280545f80516020615b6e83398151915293929190829060ff166003811115612cbe57612cbe61505e565b6003811115612ccf57612ccf61505e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dfd575f84815260048701602052604090205461271090612daf90600160a01b900461ffff16856155de565b612db991906155a5565b915081866007015f8681526020019081526020015f205f828254612ddd9190615570565b90915550612ded905082846157ab565b9050612dfd856020015182612bed565b612e128560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e8f57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612ede57612ea68160016157ab565b612eb19060086155de565b61ffff16868281518110612ec757612ec761529b565b016020015160f81c901b9190911790600101612e92565b5061ffff811615612f085760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f6357612f1f8160036157ab565b612f2a9060086155de565b63ffffffff1687612f3c836002615570565b81518110612f4c57612f4c61529b565b016020015160f81c901b9190911790600101612f0b565b5063ffffffff8116600314612f8b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fe057612fa281601f6157ab565b612fad9060086155de565b88612fb9836006615570565b81518110612fc957612fc961529b565b016020015160f81c901b9190911790600101612f8e565b505f805b600881101561303f57612ff88160076157ab565b6130039060086155de565b6001600160401b031689613018836026615570565b815181106130285761302861529b565b016020015160f81c901b9190911790600101612fe4565b505f805b600881101561309e576130578160076157ab565b6130629060086155de565b6001600160401b03168a61307783602e615570565b815181106130875761308761529b565b016020015160f81c901b9190911790600101613043565b5091989097509095509350505050565b5f8082516027146130e457825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b6002811015613133576130fb8160016157ab565b6131069060086155de565b61ffff1685828151811061311c5761311c61529b565b016020015160f81c901b91909117906001016130e7565b5061ffff81161561315d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156131b8576131748160036157ab565b61317f9060086155de565b63ffffffff1686613191836002615570565b815181106131a1576131a161529b565b016020015160f81c901b9190911790600101613160565b5063ffffffff81166002146131e057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613235576131f781601f6157ab565b6132029060086155de565b8761320e836006615570565b8151811061321e5761321e61529b565b016020015160f81c901b91909117906001016131e3565b505f8660268151811061324a5761324a61529b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b6e83398151915290600160401b900461ffff90811690861610806132be575061271061ffff8616115b156132e257604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b03908116908516101561331e576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806133305750806001015483115b156133515760405163222d164360e21b815260048101849052602401610631565b825f61335c82610e95565b90505f6133698983614031565b9050604051806080016040528061337d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615b6e8339815191528161345184610e95565b90505f61345d876119f2565b9050613468876123ca565b613488576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561349d5761349d61505e565b146134be57805160405163170cc93360e21b815261063191906004016151f0565b5f8282608001516134cf919061568e565b905083600201600a9054906101000a90046001600160401b031682604001516134f89190615869565b6001600160401b0316816001600160401b0316111561353557604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806135418a8461370d565b915091505f8a8360405160200161356f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136025761360261505e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615bce833981519152602052604081206002015481905f80516020615b8e83398151915290600160801b90046001600160401b031661375585826145a9565b5f61375f87614783565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137af8a858b611eed565b6040518263ffffffff1660e01b81526004016137cb91906151fe565b6020604051808303815f875af11580156137e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061380b9190615210565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b6e83398151915290505f61388484604001516119f2565b90505f60038251600581111561389c5761389c61505e565b14806138ba57506004825160058111156138b8576138b861505e565b145b156138ca575060c0810151613907565b6002825160058111156138df576138df61505e565b036138eb575042613907565b815160405163170cc93360e21b815261063191906004016151f0565b84608001516001600160401b0316816001600160401b03161161392e57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613953906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156139e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a079190615210565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a5957604051631afcd79f60e31b815260040160405180910390fd5b565b613a63613a10565b613a6c816147f8565b613a74614811565b610f7560608201356080830135613a9160c0850160a08601614fe0565b613aa160e0860160c08701615894565b613ab2610100870160e088016158ad565b613ac46101208801610100890161523b565b614821565b5f808251602e14613aff57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b4e57613b168160016157ab565b613b219060086155de565b61ffff16858281518110613b3757613b3761529b565b016020015160f81c901b9190911790600101613b02565b5061ffff811615613b785760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613bd357613b8f8160036157ab565b613b9a9060086155de565b63ffffffff1686613bac836002615570565b81518110613bbc57613bbc61529b565b016020015160f81c901b9190911790600101613b7b565b5063ffffffff811615613bf957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c4e57613c1081601f6157ab565b613c1b9060086155de565b87613c27836006615570565b81518110613c3757613c3761529b565b016020015160f81c901b9190911790600101613bfc565b505f805b6008811015613cad57613c668160076157ab565b613c719060086155de565b6001600160401b031688613c86836026615570565b81518110613c9657613c9661529b565b016020015160f81c901b9190911790600101613c52565b5090969095509350505050565b613cc2614e3c565b5f8281525f80516020615bce8339815191526020526040808220815160e0810190925280545f80516020615b8e83398151915293929190829060ff166005811115613d0f57613d0f61505e565b6005811115613d2057613d2061505e565b8152602001600182018054613d34906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054613d60906151be565b8015613dab5780601f10613d8257610100808354040283529160200191613dab565b820191905f5260205f20905b815481529060010190602001808311613d8e57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613e1957613e1961505e565b14613e4c575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016151f0565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e9057613e9061505e565b021790555060208201516001820190613ea990826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f47858261370d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613fc15760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461400a576040519150601f19603f3d011682016040523d82523d5f602084013e61400f565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661407557604051637fab81e560e01b815260040160405180910390fd5b5f80516020615b8e833981519152426140946060860160408701614fe0565b6001600160401b03161115806140ce57506140b26202a30042615570565b6140c26060860160408701614fe0565b6001600160401b031610155b15614108576140e36060850160408601614fe0565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b61411d61411860608601866158cd565b6149b7565b61412d61411860808601866158cd565b603061413c60208601866157be565b90501461416e5761415060208501856157be565b6040516326475b2f60e11b8152610631925060040190815260200190565b61417884806157be565b90505f036141a55761418a84806157be565b604051633e08a12560e11b81526004016106319291906158e1565b5f600882016141b486806157be565b6040516141c292919061567f565b908152602001604051809103902054146141fb576141e084806157be565b60405163a41f772f60e01b81526004016106319291906158e1565b614205835f6145a9565b6040805160e08101909152815481525f908190614311906020810161422a89806157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614272908a018a6157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016142bb60608a0160408b01614fe0565b6001600160401b031681526020016142d660608a018a6158cd565b6142df9061590f565b81526020016142f160808a018a6158cd565b6142fa9061590f565b8152602001876001600160401b0316815250614b20565b5f8281526006860160205260409020919350915061432f82826154a1565b50816008840161433f88806157be565b60405161434d92919061567f565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143899085906004016151fe565b6020604051808303815f875af11580156143a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143c99190615210565b6040805160e0810190915290915080600181526020016143e989806157be565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156144785761447861505e565b02179055506020820151600182019061449190826154a1565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061452f88806157be565b60405161453d92919061567f565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061457b9190614fe0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615b8e8339815191525f6001600160401b0380841690851611156145dd576145d683856156ae565b90506145ea565b6145e784846156ae565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061464c575060018401548151614648916001600160401b031690615570565b8210155b15614672576001600160401b038316606082015281815260408101516020820152614691565b8281606001818151614684919061568e565b6001600160401b03169052505b60608101516146a1906064615869565b602082015160018601546001600160401b0392909216916146cc9190600160401b900460ff166155de565b10156146fc57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516147179190615570565b9052506040810180516001600160401b03871691906147379083906157ab565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bce8339815191526020526040812060020180545f80516020615b8e83398151915291906008906147cd90600160401b90046001600160401b03166159d6565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614800613a10565b614808614d0d565b610f7581614d15565b614819613a10565b613a59614dfd565b614829613a10565b5f80516020615b6e83398151915261ffff8416158061484d575061271061ffff8516115b1561487157604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156148955760405163222d164360e21b815260048101889052602401610631565b60ff831615806148a85750600a60ff8416115b156148cb5760405163170db35960e31b815260ff84166004820152602401610631565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316856001600160401b03161015614932576040516202a06d60e11b81526001600160401b0386166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6149c46020820182614f89565b63ffffffff161580156149e457506149df6020820182615256565b151590505b15614a2b576149f66020820182614f89565b614a036020830183615256565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b614a386020820182615256565b9050614a476020830183614f89565b63ffffffff161115614a60576149f66020820182614f89565b60015b614a706020830183615256565b90508110156114da57614a866020830183615256565b614a916001846157ab565b818110614aa057614aa061529b565b9050602002016020810190614ab5919061523b565b6001600160a01b0316614acb6020840184615256565b83818110614adb57614adb61529b565b9050602002016020810190614af0919061523b565b6001600160a01b03161015614b1857604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a63565b5f6060826040015151603014614b495760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b8a988a9860019892979296909590949093909291016159f1565b60405160208183030381529060405290505f5b84608001516020015151811015614bfc57818560800151602001518281518110614bc957614bc961529b565b6020026020010151604051602001614be2929190615aab565b60408051601f198184030181529190529150600101614b9d565b5060a0840151805160209182015151604051614c1c938593929101615ae1565b60405160208183030381529060405290505f5b8460a001516020015151811015614c8e57818560a00151602001518281518110614c5b57614c5b61529b565b6020026020010151604051602001614c74929190615aab565b60408051601f198184030181529190529150600101614c2f565b5060c0840151604051614ca5918391602001615b1c565b6040516020818303038152906040529050600281604051614cc6919061544c565b602060405180830381855afa158015614ce1573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d049190615210565b94909350915050565b613a59613a10565b614d1d613a10565b80355f80516020615b8e8339815191529081556014614d4260608401604085016158ad565b60ff161180614d615750614d5c60608301604084016158ad565b60ff16155b15614d9557614d7660608301604084016158ad565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614da560608301604084016158ad565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614dd66040830160208401614fe0565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c5e613a10565b508054614e11906151be565b5f825580601f10614e20575050565b601f0160209004905f5260205f2090810190610f759190614e79565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e8d575f8155600101614e7a565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614ec3575f80fd5b833592506020840135614ed581614e91565b9150614ee360408501614e9e565b90509250925092565b5f60208284031215614efc575f80fd5b5035919050565b5f8060408385031215614f14575f80fd5b82356001600160401b03811115614f29575f80fd5b830160808186031215614f3a575f80fd5b9150614f4860208401614e9e565b90509250929050565b5f6101208284031215614f62575f80fd5b50919050565b5f8060408385031215614f79575f80fd5b82359150614f4860208401614e9e565b5f60208284031215614f99575f80fd5b61169482614e9e565b5f8060408385031215614fb3575f80fd5b614fbc83614e9e565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614ff0575f80fd5b61169482614fca565b803561ffff811681146119ed575f80fd5b5f805f6060848603121561501c575f80fd5b83356001600160401b03811115615031575f80fd5b840160a08187031215615042575f80fd5b925061505060208501614ff9565b9150614ee360408501614fca565b634e487b7160e01b5f52602160045260245ffd5b600681106150825761508261505e565b9052565b5f5b838110156150a0578181015183820152602001615088565b50505f910152565b5f81518084526150bf816020860160208601615086565b601f01601f19169290920160200192915050565b602081526150e5602082018351615072565b5f602083015160e060408401526151006101008401826150a8565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615164575f80fd5b82356001600160401b038082111561517a575f80fd5b818501915085601f83011261518d575f80fd5b81358181111561519b575f80fd5b8660208285010111156151ac575f80fd5b60209290920196919550909350505050565b600181811c908216806151d257607f821691505b602082108103614f6257634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284615072565b602081525f61169460208301846150a8565b5f60208284031215615220575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561524b575f80fd5b813561169481615227565b5f808335601e1984360301811261526b575f80fd5b8301803591506001600160401b03821115615284575f80fd5b6020019150600581901b360382131561385d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152c3575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615303576153036152cd565b60405290565b604080519081016001600160401b0381118282101715615303576153036152cd565b604051601f8201601f191681016001600160401b0381118282101715615353576153536152cd565b604052919050565b5f6001600160401b03821115615373576153736152cd565b50601f01601f191660200190565b5f82601f830112615390575f80fd5b81356153a361539e8261535b565b61532b565b8181528460208386010111156153b7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153e3575f80fd5b6153eb6152e1565b82356001600160401b0380821115615401575f80fd5b61540d36838701615381565b83526020850135915080821115615422575f80fd5b5061542f36828601615381565b60208301525061544160408401614fca565b604082015292915050565b5f82516152c3818460208701615086565b601f82111561063a57805f5260205f20601f840160051c810160208510156154825750805b601f840160051c820191505b8181101561187d575f815560010161548e565b81516001600160401b038111156154ba576154ba6152cd565b6154ce816154c884546151be565b8461545d565b602080601f831160018114615501575f84156154ea5750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561552f57888601518255948401946001909101908401615510565b508582101561554c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea561555c565b5f63ffffffff80831681810361559b5761559b61555c565b6001019392505050565b5f826155bf57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155d8576155d861505e565b91905290565b8082028115828204841417610ea557610ea561555c565b5f60208083525f8454615607816151be565b806020870152604060018084165f8114615628576001811461564457615671565b60ff19851660408a0152604084151560051b8a01019550615671565b895f5260205f205f5b858110156156685781548b820186015290830190880161564d565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561204b5761204b61555c565b6001600160401b0382811682821603908082111561204b5761204b61555c565b80516119ed81614e91565b5f80604083850312156156ea575f80fd5b82516001600160401b0380821115615700575f80fd5b9084019060608287031215615713575f80fd5b61571b6152e1565b8251815260208084015161572e81615227565b82820152604084015183811115615743575f80fd5b80850194505087601f850112615757575f80fd5b8351925061576761539e8461535b565b838152888285870101111561577a575f80fd5b61578984838301848801615086565b8060408401525081955061579e8188016156ce565b9450505050509250929050565b81810381811115610ea557610ea561555c565b5f808335601e198436030181126157d3575f80fd5b8301803591506001600160401b038211156157ec575f80fd5b60200191503681900382131561385d575f80fd5b5f8851615811818460208d01615086565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461588c5761588c61555c565b505092915050565b5f602082840312156158a4575f80fd5b61169482614ff9565b5f602082840312156158bd575f80fd5b813560ff81168114611694575f80fd5b5f8235603e198336030181126152c3575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6040823603121561591f575f80fd5b615927615309565b61593083614e9e565b81526020808401356001600160401b038082111561594c575f80fd5b9085019036601f83011261595e575f80fd5b813581811115615970576159706152cd565b8060051b915061598184830161532b565b818152918301840191848101903684111561599a575f80fd5b938501935b838510156159c457843592506159b483615227565b828252938501939085019061599f565b94860194909452509295945050505050565b5f6001600160401b0380831681810361559b5761559b61555c565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a3781602a850160208b01615086565b865190830190615a4e81602a840160208b01615086565b60c087901b6001600160c01b031916602a9290910191820152615a80603282018660e01b6001600160e01b0319169052565b615a99603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615abc818460208801615086565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615af2818460208901615086565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b2d818460208801615086565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index ea7a9b5a4..4d862e2a3 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -496,11 +496,6 @@ abstract contract PoSValidatorManager is revert InvalidDelegatorStatus(delegator.status); } - // Check that minimum stake duration has passed. - if (block.timestamp < delegator.startedAt + $._minimumStakeDuration) { - revert MinStakeDurationNotPassed(uint64(block.timestamp)); - } - // Only the delegation owner or parent validator can end the delegation. if (delegator.owner != _msgSender()) { // Validators can only remove delegations after the minimum stake duration has passed. @@ -517,6 +512,11 @@ abstract contract PoSValidatorManager is } if (validator.status == ValidatorStatus.Active) { + // Check that minimum stake duration has passed. + if (block.timestamp < delegator.startedAt + $._minimumStakeDuration) { + revert MinStakeDurationNotPassed(uint64(block.timestamp)); + } + if (includeUptimeProof) { // Uptime proofs include the absolute number of seconds the validator has been active. _updateUptime(validationID, messageIndex); From 39af59b7bcf3341e1f47b24ddca2fc9161276f03 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 14:29:01 -0400 Subject: [PATCH 11/35] Add tests for invalid min stake duration --- .../tests/ERC20TokenStakingManagerTests.t.sol | 26 +++++++++++++++++++ .../NativeTokenStakingManagerTests.t.sol | 25 ++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index c85356bc9..5ba7fbffc 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -156,6 +156,32 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { } function testMaxStakeMultiplierOverLimit() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + uint64 minStakeDuration = DEFAULT_CHURN_PERIOD - 1; + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidMinStakeDuration.selector, minStakeDuration + ) + ); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: minStakeDuration, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + } + + function testInvalidMinimumStakeDuration() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; vm.expectRevert( diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index fd748830e..6b4dfb699 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -169,6 +169,31 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testMinStakeDurationTooLow() public { + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + uint64 minStakeDuration = DEFAULT_CHURN_PERIOD - 1; + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidMinStakeDuration.selector, minStakeDuration + ) + ); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: minStakeDuration, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + // Helpers function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, From 05d22ce15fac0011fb9c1521e1b961b366034be4 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 14:33:40 -0400 Subject: [PATCH 12/35] Add tests for delegator not staked long enough --- .../tests/PoSValidatorManagerTests.t.sol | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 645b5f99e..34703da07 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -439,6 +439,26 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } + function testInitializeEndDelegationMinStakeDurationNotPassed() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + uint64 invalidEndTime = + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION - 1; + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.MinStakeDurationNotPassed.selector, invalidEndTime + ) + ); + _initializeEndDelegation({ + sender: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + endDelegationTimestamp: invalidEndTime, + includeUptime: false, + force: false + }); + } + function testInitializeEndDelegationInsufficientUptime() public { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); From 21bbebda717f7c0ac8b9e3bbdf940193d4ce0004 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Fri, 18 Oct 2024 16:53:21 -0400 Subject: [PATCH 13/35] fix natspec for packRegisterSubnetValidatorMessage --- contracts/validator-manager/ValidatorMessages.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index c7687c27d..a9cdffe25 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -196,9 +196,9 @@ library ValidatorMessages { * +-----------------------+-------------+--------------------------------------------------------------------+ * | expiry : uint64 | 8 bytes | * +-----------------------+-------------+--------------------------------------------------------------------+ - * | remainingBalanceOwner : PChainOwner | 4 + len(addresses) * 20 bytes | + * | remainingBalanceOwner : PChainOwner | 8 + len(addresses) * 20 bytes | * +-----------------------+-------------+--------------------------------------------------------------------+ - * | disableOwner : PChainOwner | 4 + len(addresses) * 20 bytes | + * | disableOwner : PChainOwner | 8 + len(addresses) * 20 bytes | * +-----------------------+-------------+--------------------------------------------------------------------+ * | weight : uint64 | 8 bytes | * +-----------------------+-------------+--------------------------------------------------------------------+ From be8815cc7e1f7238be86e05cf97f7141957edf5c Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 18:51:32 -0400 Subject: [PATCH 14/35] Update contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- .../validator-manager/interfaces/IERC20TokenStakingManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol index 7dd299358..9a000d003 100644 --- a/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol @@ -29,7 +29,7 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { /** * @notice Begins the delegator registration process. Locks the specified ERC20 tokens in the contract as the stake. * @param validationID The ID of the validator to stake to. - * @param stakeAmount The amount of tokens of stake. + * @param stakeAmount The amount of tokens to stake. */ function initializeDelegatorRegistration( bytes32 validationID, From a475d5c6e26ac0140ab751abf3a782af6bf3fc3c Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 18:51:37 -0400 Subject: [PATCH 15/35] Update contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- .../validator-manager/interfaces/IERC20TokenStakingManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol index 9a000d003..eb1b56a32 100644 --- a/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol @@ -17,7 +17,7 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { * @param registrationInput The inputs for a validator registration. * @param delegationFeeBips The fee that delegators must pay to delegate to this validator. * @param minStakeDuration The minimum amount of time this validator must be staked for in seconds. - * @param stakeAmount The amount of tokens of stake. + * @param stakeAmount The amount of tokens to stake. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, From cb95e50ff51efef9c537958e63d0391cd43aaf3f Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 18:51:55 -0400 Subject: [PATCH 16/35] Update contracts/validator-manager/interfaces/IPoSValidatorManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- contracts/validator-manager/interfaces/IPoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index b0f829ea5..b3274940f 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -61,7 +61,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a delegator registration is initiated * @param delegationID The ID of the delegation - * @param validationID The ID of the validation perdiod being delegated to + * @param validationID The ID of the validation period being delegated to * @param delegatorAddress The address of the delegator * @param nonce The message nonce used to update the validator weight * @param validatorWeight The updated validator weight that is sent to the P-Chain From 0165063e6a24de7eda2633a92838a2f6510bfd9e Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 21 Oct 2024 11:23:21 -0500 Subject: [PATCH 17/35] parameterize weight to value factor --- .../ERC20TokenStakingManager.go | 29 ++++++++++--------- .../NativeTokenStakingManager.go | 29 ++++++++++--------- .../validator-manager/PoSValidatorManager.sol | 13 ++++++--- .../interfaces/IPoSValidatorManager.sol | 1 + .../tests/ERC20TokenStakingManagerTests.t.sol | 6 ++++ .../NativeTokenStakingManagerTests.t.sol | 6 ++++ .../tests/PoSValidatorManagerTests.t.sol | 1 + tests/flows/validator-manager/poa_to_pos.go | 1 + tests/utils/validator_manager.go | 3 ++ 9 files changed, 57 insertions(+), 32 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index e2f8a418b..7869e692c 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -50,6 +50,7 @@ type PoSValidatorManagerSettings struct { MinimumStakeDuration uint64 MinimumDelegationFeeBips uint16 MaximumStakeMultiplier uint8 + WeightToValueFactor *big.Int RewardCalculator common.Address } @@ -90,8 +91,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161600238038061600283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615eb58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f09969ae1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f3660046150d3565b6104b3565b005b61021461022436600461510e565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b6102146102563660046150d3565b6106f6565b610214610269366004615125565b610701565b61021461027c366004615173565b610c2b565b61029461028f36600461510e565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d63660046150d3565b610cb5565b6102146102e9366004615194565b610cc0565b6103016102fc3660046151d4565b610d82565b60405190815260200161023f565b61021461031d366004615239565b610db7565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d366004615261565b611022565b61029461036036600461510e565b61103b565b6103015f81565b61021461037a3660046150d3565b61104f565b610231603081565b61021461039536600461510e565b61107a565b6102146103a8366004615239565b611145565b6103016103bb36600461527a565b61131d565b6102146103ce366004615194565b611349565b6103015f80516020615e2983398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b36600461510e565b6114d2565b6103015f80516020615e4983398151915281565b61021461044236600461510e565b6116bb565b610231601481565b61046261045d36600461510e565b6117f8565b60405161023f919061530f565b6102946202a30081565b6103015f80516020615e0983398151915281565b61021461049b3660046153a3565b611947565b6103016104ae3660046153e1565b611a26565b6104be838383611a81565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615e898339815191526020526040808220815160e0810190925280545f80516020615e4983398151915293929190829060ff1660058111156105355761053561529a565b60058111156105465761054661529a565b815260200160018201805461055a9061544c565b80601f01602080910402602001604051908101604052809291908181526020018280546105869061544c565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c61529a565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615484565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611d8f565b6040518263ffffffff1660e01b81526004016106b09190615492565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906154a4565b50505050565b6106f0838383611a81565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615e498339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906154a4565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f460608501604086016154bb565b6001600160a01b0316146108375761081260608401604085016154bb565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f61084560608501856154d6565b905090505f805b828163ffffffff161015610b2d575f61086860608801886154d6565b8363ffffffff1681811061087e5761087e61551b565b9050602002810190610890919061552f565b61089990615653565b80516040519192505f9160088801916108b1916156cc565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da9190600401615492565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a916156cc565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906154a4565b90508086600801835f015160405161098091906156cc565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a0261529a565b021790555060208201516001820190610a1b9082615721565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac09116856157f0565b8251604051919550610ad1916156cc565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615803565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff1683615825565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611dde565b60400151611ef4565b90505f610b9587612081565b90505f600282604051610ba891906156cc565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906154a4565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c348261225b565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e836117f8565b5190506002816005811115610c7557610c7561529a565b14610c95578060405163170cc93360e21b81526004016104da9190615484565b6106f08383612296565b5f610caf64e8d4a510008361583c565b92915050565b6106f0838383612510565b610cc86126fc565b5f80516020615e298339815191525f80610ce184612733565b91509150610cee8261225b565b610cfa57505050610d69565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610d2957610d2961529a565b03610d4e575f83815260078501602052604081208054919055610d4c8282612a71565b505b610d6481610d5f8460400151611022565b612ae7565b505050505b610d7f60015f80516020615e6983398151915255565b50565b5f610d8b6126fc565b610d9785858585612b1d565b9050610daf60015f80516020615e6983398151915255565b949350505050565b5f8181525f80516020615de98339815191526020526040808220815160e0810190925280545f80516020615e2983398151915293929190829060ff166003811115610e0457610e0461529a565b6003811115610e1557610e1561529a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e8b826117f8565b9050600183516003811115610ea257610ea261529a565b14610ec3578251604051633b0d540d60e21b81526104da919060040161585b565b600481516005811115610ed857610ed861529a565b03610eee57610ee685612cf6565b505050505050565b5f80610f05610efc89611dde565b60400151612edd565b5091509150818414610f3257846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610f6b5750806001600160401b03168560a001516001600160401b0316115b15610f9457604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610caf6001600160401b03831664e8d4a51000615825565b5f611045826117f8565b6080015192915050565b61105a838383612510565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615e298339815191525f611092836117f8565b51905060048160058111156110a9576110a961529a565b146110c9578060405163170cc93360e21b81526004016104da9190615484565b5f8381526004830160205260409020546001600160a01b0316331461110f57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600783016020908152604080832080549084905560048601909252909120546106f0906001600160a01b031682612a71565b61114d6126fc565b5f8181525f80516020615de98339815191526020526040808220815160e0810190925280545f80516020615e2983398151915293929190829060ff16600381111561119a5761119a61529a565b60038111156111ab576111ab61529a565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156112245761122461529a565b14611245578051604051633b0d540d60e21b81526104da919060040161585b565b600461125482604001516117f8565b5160058111156112665761126661529a565b146112f8575f61127585611dde565b90505f806112868360400151612edd565b5091509150818460400151146112b25760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b031611156112f457604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61130183612cf6565b505061131960015f80516020615e6983398151915255565b5050565b5f6113266126fc565b611331833384613133565b9050610caf60015f80516020615e6983398151915255565b5f80516020615e498339815191525f8061136e61136585611dde565b6040015161340b565b915091508061139457604051632d07135360e01b815281151560048201526024016104da565b5f828152600684016020526040902080546113ae9061544c565b90505f036113d25760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff1660058111156113f8576113f861529a565b1461142b575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615484565b5f828152600684016020526040812061144391615022565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615de98339815191526020526040808220815160e0810190925280545f80516020615e2983398151915293929190829060ff16600381111561151f5761151f61529a565b60038111156115305761153061529a565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115a9576115a961529a565b141580156115ca57506003815160038111156115c7576115c761529a565b14155b156115eb578051604051633b0d540d60e21b81526104da919060040161585b565b5f6115f982604001516117f8565b905080606001516001600160401b03165f0361162b576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb611658846040015184606001518560800151611d8f565b6040518263ffffffff1660e01b81526004016116749190615492565b6020604051808303815f875af1158015611690573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b491906154a4565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615e4983398151915291906117029061544c565b90505f036117265760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff16600581111561174c5761174c61529a565b1461177f575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615484565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b89190600401615875565b6020604051808303815f875af11580156117d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906154a4565b611800615059565b5f8281525f80516020615e89833981519152602052604090819020815160e0810190925280545f80516020615e49833981519152929190829060ff16600581111561184d5761184d61529a565b600581111561185e5761185e61529a565b81526020016001820180546118729061544c565b80601f016020809104026020016040519081016040528092919081815260200182805461189e9061544c565b80156118e95780601f106118c0576101008083540402835291602001916118e9565b820191905f5260205f20905b8154815290600101906020018083116118cc57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611990575080546001600160401b03808416911610155b156119ae5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119d984846135c7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615e49833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a6990869086906158ff565b90815260200160405180910390205491505092915050565b5f8381525f80516020615de98339815191526020526040808220815160e0810190925280545f80516020615e298339815191529284929091829060ff166003811115611acf57611acf61529a565b6003811115611ae057611ae061529a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b56826117f8565b9050600283516003811115611b6d57611b6d61529a565b14611b8e578251604051633b0d540d60e21b81526104da919060040161585b565b60208301516001600160a01b03163314611c31575f828152600485016020526040902054336001600160a01b0390911603611c2b575f82815260048501602052604090205460a0820151611bf291600160b01b90046001600160401b03169061590e565b6001600160401b0316421015611c265760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611c31565b336110ea565b600281516005811115611c4657611c4661529a565b03611d23578615611c5d57611c5b8287612296565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c96918491611c91919061592e565b6135e1565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611cd784613738565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d889350505050565b600481516005811115611d3857611d3861529a565b03611d6c57611d4683613738565b5f898152600686016020526040902055611d5f88612cf6565b6001945050505050611d88565b805160405163170cc93360e21b81526104da9190600401615484565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e42573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e699190810190615959565b9150915080611e8b57604051636b2f19e960e01b815260040160405180910390fd5b815115611eb1578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611eed576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611f2957815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b6002811015611f7857611f40816001615a2b565b611f4b906008615825565b61ffff16848281518110611f6157611f6161551b565b016020015160f81c901b9190911790600101611f2c565b5061ffff811615611fa25760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015611ffd57611fb9816003615a2b565b611fc4906008615825565b63ffffffff1685611fd68360026157f0565b81518110611fe657611fe661551b565b016020015160f81c901b9190911790600101611fa5565b5063ffffffff81161561202357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120785761203a81601f615a2b565b612045906008615825565b866120518360066157f0565b815181106120615761206161551b565b016020015160f81c901b9190911790600101612026565b50949350505050565b60605f8083356020850135601461209d878701604089016154bb565b6120aa60608901896154d6565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61213060608501856154d6565b9050811015611eed578161214760608601866154d6565b838181106121575761215761551b565b9050602002810190612169919061552f565b6121739080615a3e565b905061218260608701876154d6565b848181106121925761219261551b565b90506020028101906121a4919061552f565b6121ae9080615a3e565b6121bb60608901896154d6565b868181106121cb576121cb61551b565b90506020028101906121dd919061552f565b6121eb906020810190615a3e565b6121f860608b018b6154d6565b888181106122085761220861551b565b905060200281019061221a919061552f565b61222b906060810190604001615261565b6040516020016122419796959493929190615a80565b60408051601f198184030181529190529150600101612123565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122e1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123089190810190615959565b915091508061232a57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561236d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061239191906154a4565b8251146123b7578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b0316156123f3576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061240284604001516138d6565b915091508187146124295760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615e29833981519152906001600160401b0390811690831611156124e6575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612505565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e298339815191528161252986613ac7565b90506125348661225b565b61254357600192505050611d88565b5f8681526004830160205260409020546001600160a01b0316331461256857336110ea565b5f86815260048301602052604090205460a082015161259791600160b01b90046001600160401b03169061590e565b6001600160401b03168160c001516001600160401b031610156125de5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156125f6576125ef8786612296565b9050612614565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b031690634f22429f9061263990611022565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156126a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c691906154a4565b905080846007015f8a81526020019081526020015f205f8282546126ea91906157f0565b90915550501515979650505050505050565b5f80516020615e6983398151915280546001190161272d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61273c615059565b5f80516020615e498339815191525f8061275861136587611dde565b91509150801561277f57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127b0576127b061529a565b60058111156127c1576127c161529a565b81526020016001820180546127d59061544c565b80601f01602080910402602001604051908101604052809291908181526020018280546128019061544c565b801561284c5780601f106128235761010080835404028352916020019161284c565b820191905f5260205f20905b81548152906001019060200180831161282f57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128b7576128b761529a565b141580156128d857506001815160058111156128d5576128d561529a565b14155b156128f957805160405163170cc93360e21b81526104da9190600401615484565b60038151600581111561290e5761290e61529a565b0361291c5760048152612921565b600581525b83600801816020015160405161293791906156cc565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561297b5761297b61529a565b0217905550602082015160018201906129949082615721565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a3a57612a3a61529a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e0983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612acc575f80fd5b505af1158015612ade573d5f803e3d5ffd5b50505050505050565b5f80516020615e0983398151915254611319906001600160a01b03168383613dab565b60015f80516020615e6983398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e2983398151915290600160401b900461ffff9081169086161080612b71575061271061ffff8616115b15612b9557604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612bd1576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612be35750806001015483115b15612c045760405163222d164360e21b8152600481018490526024016104da565b5f612c0e84613e0a565b90505f612c1a82610c9f565b90505f612c278983613e2d565b90506040518060800160405280612c3b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615de98339815191526020526040808220815160e0810190925280545f80516020615e2983398151915293929190829060ff166003811115612d4357612d4361529a565b6003811115612d5457612d5461529a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e82575f84815260048701602052604090205461271090612e3490600160a01b900461ffff1685615825565b612e3e919061583c565b915081866007015f8681526020019081526020015f205f828254612e6291906157f0565b90915550612e7290508284615a2b565b9050612e82856020015182612a71565b612e978560200151610d5f8760600151611022565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f1457835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612f6357612f2b816001615a2b565b612f36906008615825565b61ffff16868281518110612f4c57612f4c61551b565b016020015160f81c901b9190911790600101612f17565b5061ffff811615612f8d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015612fe857612fa4816003615a2b565b612faf906008615825565b63ffffffff1687612fc18360026157f0565b81518110612fd157612fd161551b565b016020015160f81c901b9190911790600101612f90565b5063ffffffff811660031461301057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130655761302781601f615a2b565b613032906008615825565b8861303e8360066157f0565b8151811061304e5761304e61551b565b016020015160f81c901b9190911790600101613013565b505f805b60088110156130c45761307d816007615a2b565b613088906008615825565b6001600160401b03168961309d8360266157f0565b815181106130ad576130ad61551b565b016020015160f81c901b9190911790600101613069565b505f805b6008811015613123576130dc816007615a2b565b6130e7906008615825565b6001600160401b03168a6130fc83602e6157f0565b8151811061310c5761310c61551b565b016020015160f81c901b91909117906001016130c8565b5091989097509095509350505050565b5f5f80516020615e298339815191528161314f61028f85613e0a565b90505f61315b876117f8565b90506131668761225b565b613186576040516330efa98b60e01b8152600481018890526024016104da565b60028151600581111561319b5761319b61529a565b146131bc57805160405163170cc93360e21b81526104da9190600401615484565b5f8282608001516131cd919061590e565b905083600201600a9054906101000a90046001600160401b031682604001516131f69190615ae9565b6001600160401b0316816001600160401b0316111561323357604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f8061323f8a846135e1565b915091505f8a8360405160200161326d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156133005761330061529a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461344157825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b600281101561349057613458816001615a2b565b613463906008615825565b61ffff168582815181106134795761347961551b565b016020015160f81c901b9190911790600101613444565b5061ffff8116156134ba5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613515576134d1816003615a2b565b6134dc906008615825565b63ffffffff16866134ee8360026157f0565b815181106134fe576134fe61551b565b016020015160f81c901b91909117906001016134bd565b5063ffffffff811660021461353d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135925761355481601f615a2b565b61355f906008615825565b8761356b8360066157f0565b8151811061357b5761357b61551b565b016020015160f81c901b9190911790600101613540565b505f866026815181106135a7576135a761551b565b016020015191976001600160f81b03199092161515965090945050505050565b6135cf6143a5565b6135d8826143f0565b6113198161445e565b5f8281525f80516020615e89833981519152602052604081206002015481905f80516020615e4983398151915290600160801b90046001600160401b031661362985826144c6565b5f613633876146e9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136838a858b611d8f565b6040518263ffffffff1660e01b815260040161369f9190615492565b6020604051808303815f875af11580156136bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136df91906154a4565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e2983398151915290505f61375884604001516117f8565b90505f6003825160058111156137705761377061529a565b148061378e575060048251600581111561378c5761378c61529a565b145b1561379e575060c08101516137db565b6002825160058111156137b3576137b361529a565b036137bf5750426137db565b815160405163170cc93360e21b81526104da9190600401615484565b84608001516001600160401b0316816001600160401b03161161380257505f949350505050565b600383015460608601516001600160a01b0390911690634f22429f9061382790611022565b60a085015160808901516040808b01515f90815260048a81016020529082902060010154915160e087901b6001600160e01b0319168152908101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156138a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138cd91906154a4565b95945050505050565b5f808251602e1461390c57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b600281101561395b57613923816001615a2b565b61392e906008615825565b61ffff168582815181106139445761394461551b565b016020015160f81c901b919091179060010161390f565b5061ffff8116156139855760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156139e05761399c816003615a2b565b6139a7906008615825565b63ffffffff16866139b98360026157f0565b815181106139c9576139c961551b565b016020015160f81c901b9190911790600101613988565b5063ffffffff811615613a0657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a5b57613a1d81601f615a2b565b613a28906008615825565b87613a348360066157f0565b81518110613a4457613a4461551b565b016020015160f81c901b9190911790600101613a09565b505f805b6008811015613aba57613a73816007615a2b565b613a7e906008615825565b6001600160401b031688613a938360266157f0565b81518110613aa357613aa361551b565b016020015160f81c901b9190911790600101613a5f565b5090969095509350505050565b613acf615059565b5f8281525f80516020615e898339815191526020526040808220815160e0810190925280545f80516020615e4983398151915293929190829060ff166005811115613b1c57613b1c61529a565b6005811115613b2d57613b2d61529a565b8152602001600182018054613b419061544c565b80601f0160208091040260200160405190810160405280929190818152602001828054613b6d9061544c565b8015613bb85780601f10613b8f57610100808354040283529160200191613bb8565b820191905f5260205f20905b815481529060010190602001808311613b9b57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c2657613c2661529a565b14613c59575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615484565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c9d57613c9d61529a565b021790555060208201516001820190613cb69082615721565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d5485826135e1565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061475e565b5f610caf825f80516020615e09833981519152546001600160a01b0316906147bf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e7157604051637fab81e560e01b815260040160405180910390fd5b5f80516020615e4983398151915242613e906060860160408701615261565b6001600160401b0316111580613eca5750613eae6202a300426157f0565b613ebe6060860160408701615261565b6001600160401b031610155b15613f0457613edf6060850160408601615261565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f19613f146060860186615b14565b614918565b613f29613f146080860186615b14565b6030613f386020860186615a3e565b905014613f6a57613f4c6020850185615a3e565b6040516326475b2f60e11b81526104da925060040190815260200190565b613f748480615a3e565b90505f03613fa157613f868480615a3e565b604051633e08a12560e11b81526004016104da929190615b28565b5f60088201613fb08680615a3e565b604051613fbe9291906158ff565b90815260200160405180910390205414613ff757613fdc8480615a3e565b60405163a41f772f60e01b81526004016104da929190615b28565b614001835f6144c6565b6040805160e08101909152815481525f90819061410d90602081016140268980615a3e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061406e908a018a615a3e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140b760608a0160408b01615261565b6001600160401b031681526020016140d260608a018a615b14565b6140db90615b56565b81526020016140ed60808a018a615b14565b6140f690615b56565b8152602001876001600160401b0316815250614a81565b5f8281526006860160205260409020919350915061412b8282615721565b50816008840161413b8880615a3e565b6040516141499291906158ff565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614185908590600401615492565b6020604051808303815f875af11580156141a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c591906154a4565b6040805160e0810190915290915080600181526020016141e58980615a3e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156142745761427461529a565b02179055506020820151600182019061428d9082615721565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061432b8880615a3e565b6040516143399291906158ff565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906143779190615261565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143ee57604051631afcd79f60e31b815260040160405180910390fd5b565b6143f86143a5565b61440181614c6e565b614409614c87565b610d7f6060820135608083013561442660c0850160a08601615261565b61443660e0860160c08701615c1d565b614447610100870160e08801615c36565b614459610120880161010089016154bb565b614c97565b6144666143a5565b5f80516020615e098339815191526001600160a01b0382166144a657604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615e498339815191525f6001600160401b0380841690851611156144fa576144f3838561592e565b9050614507565b614504848461592e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614569575060018401548151614565916001600160401b0316906157f0565b8210155b1561458f576001600160401b0383166060820152818152604081015160208201526145ae565b82816060018181516145a1919061590e565b6001600160401b03169052505b60608101516145be906064615ae9565b602082015160018601546001600160401b0392909216916145e99190600160401b900460ff16615825565b101561461957606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b03168160400181815161463491906157f0565b9052506040810180516001600160401b0387169190614654908390615a2b565b9052506001840154604082015160649161467991600160401b90910460ff1690615825565b10156146a0578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615e898339815191526020526040812060020180545f80516020615e49833981519152919060089061473390600160401b90046001600160401b0316615c56565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147726001600160a01b03841683614dc6565b905080515f141580156147965750808060200190518101906147949190615c71565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614805573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061482991906154a4565b90506148406001600160a01b038516333086614dd3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148a891906154a4565b905081811161490e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6138cd8282615a2b565b6149256020820182615194565b63ffffffff16158015614945575061494060208201826154d6565b151590505b1561498c576149576020820182615194565b61496460208301836154d6565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b61499960208201826154d6565b90506149a86020830183615194565b63ffffffff1611156149c1576149576020820182615194565b60015b6149d160208301836154d6565b9050811015611319576149e760208301836154d6565b6149f2600184615a2b565b818110614a0157614a0161551b565b9050602002016020810190614a1691906154bb565b6001600160a01b0316614a2c60208401846154d6565b83818110614a3c57614a3c61551b565b9050602002016020810190614a5191906154bb565b6001600160a01b03161015614a7957604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149c4565b5f6060826040015151603014614aaa5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614aeb988a986001989297929690959094909390929101615c8c565b60405160208183030381529060405290505f5b84608001516020015151811015614b5d57818560800151602001518281518110614b2a57614b2a61551b565b6020026020010151604051602001614b43929190615d46565b60408051601f198184030181529190529150600101614afe565b5060a0840151805160209182015151604051614b7d938593929101615d7c565b60405160208183030381529060405290505f5b8460a001516020015151811015614bef57818560a00151602001518281518110614bbc57614bbc61551b565b6020026020010151604051602001614bd5929190615d46565b60408051601f198184030181529190529150600101614b90565b5060c0840151604051614c06918391602001615db7565b6040516020818303038152906040529050600281604051614c2791906156cc565b602060405180830381855afa158015614c42573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c6591906154a4565b94909350915050565b614c766143a5565b614c7e614e0c565b610d7f81614e14565b614c8f6143a5565b6143ee614efc565b614c9f6143a5565b5f80516020615e2983398151915261ffff84161580614cc3575061271061ffff8516115b15614ce757604051635f12e6c360e11b815261ffff851660048201526024016104da565b85871115614d0b5760405163222d164360e21b8152600481018890526024016104da565b60ff83161580614d1e5750600a60ff8416115b15614d415760405163170db35960e31b815260ff841660048201526024016104da565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d8883835f614f04565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613dd8565b6143ee6143a5565b614e1c6143a5565b80355f80516020615e498339815191529081556014614e416060840160408501615c36565b60ff161180614e605750614e5b6060830160408401615c36565b60ff16155b15614e9457614e756060830160408401615c36565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614ea46060830160408401615c36565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614ed56040830160208401615261565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b0a6143a5565b606081471015614f295760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614f4491906156cc565b5f6040518083038185875af1925050503d805f8114614f7e576040519150601f19603f3d011682016040523d82523d5f602084013e614f83565b606091505b5091509150614f93868383614f9d565b9695505050505050565b606082614fb257614fad82614ff9565b611d88565b8151158015614fc957506001600160a01b0384163b155b15614ff257604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611d88565b8051156150095780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461502e9061544c565b5f825580601f1061503d575050565b601f0160209004905f5260205f2090810190610d7f9190615096565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156150aa575f8155600101615097565b5090565b8015158114610d7f575f80fd5b803563ffffffff811681146150ce575f80fd5b919050565b5f805f606084860312156150e5575f80fd5b8335925060208401356150f7816150ae565b9150615105604085016150bb565b90509250925092565b5f6020828403121561511e575f80fd5b5035919050565b5f8060408385031215615136575f80fd5b82356001600160401b0381111561514b575f80fd5b83016080818603121561515c575f80fd5b915061516a602084016150bb565b90509250929050565b5f8060408385031215615184575f80fd5b8235915061516a602084016150bb565b5f602082840312156151a4575f80fd5b611d88826150bb565b803561ffff811681146150ce575f80fd5b80356001600160401b03811681146150ce575f80fd5b5f805f80608085870312156151e7575f80fd5b84356001600160401b038111156151fc575f80fd5b850160a0818803121561520d575f80fd5b935061521b602086016151ad565b9250615229604086016151be565b9396929550929360600135925050565b5f806040838503121561524a575f80fd5b615253836150bb565b946020939093013593505050565b5f60208284031215615271575f80fd5b611d88826151be565b5f806040838503121561528b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106152be576152be61529a565b9052565b5f5b838110156152dc5781810151838201526020016152c4565b50505f910152565b5f81518084526152fb8160208601602086016152c2565b601f01601f19169290920160200192915050565b602081526153216020820183516152ae565b5f602083015160e0604084015261533c6101008401826152e4565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d7f575f80fd5b5f808284036101408112156153b6575f80fd5b610120808212156153c5575f80fd5b84935083013590506153d68161538f565b809150509250929050565b5f80602083850312156153f2575f80fd5b82356001600160401b0380821115615408575f80fd5b818501915085601f83011261541b575f80fd5b813581811115615429575f80fd5b86602082850101111561543a575f80fd5b60209290920196919550909350505050565b600181811c9082168061546057607f821691505b60208210810361547e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610caf82846152ae565b602081525f611d8860208301846152e4565b5f602082840312156154b4575f80fd5b5051919050565b5f602082840312156154cb575f80fd5b8135611d888161538f565b5f808335601e198436030181126154eb575f80fd5b8301803591506001600160401b03821115615504575f80fd5b6020019150600581901b3603821315613731575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615543575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155835761558361554d565b60405290565b604080519081016001600160401b03811182821017156155835761558361554d565b604051601f8201601f191681016001600160401b03811182821017156155d3576155d361554d565b604052919050565b5f6001600160401b038211156155f3576155f361554d565b50601f01601f191660200190565b5f82601f830112615610575f80fd5b813561562361561e826155db565b6155ab565b818152846020838601011115615637575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615663575f80fd5b61566b615561565b82356001600160401b0380821115615681575f80fd5b61568d36838701615601565b835260208501359150808211156156a2575f80fd5b506156af36828601615601565b6020830152506156c1604084016151be565b604082015292915050565b5f82516155438184602087016152c2565b601f8211156104e357805f5260205f20601f840160051c810160208510156157025750805b601f840160051c820191505b818110156116b4575f815560010161570e565b81516001600160401b0381111561573a5761573a61554d565b61574e81615748845461544c565b846156dd565b602080601f831160018114615781575f841561576a5750858301515b5f19600386901b1c1916600185901b178555610ee6565b5f85815260208120601f198616915b828110156157af57888601518255948401946001909101908401615790565b50858210156157cc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610caf57610caf6157dc565b5f63ffffffff80831681810361581b5761581b6157dc565b6001019392505050565b8082028115828204841417610caf57610caf6157dc565b5f8261585657634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061586f5761586f61529a565b91905290565b5f60208083525f84546158878161544c565b806020870152604060018084165f81146158a857600181146158c4576158f1565b60ff19851660408a0152604084151560051b8a010195506158f1565b895f5260205f205f5b858110156158e85781548b82018601529083019088016158cd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611eed57611eed6157dc565b6001600160401b03828116828216039080821115611eed57611eed6157dc565b80516150ce816150ae565b5f806040838503121561596a575f80fd5b82516001600160401b0380821115615980575f80fd5b9084019060608287031215615993575f80fd5b61599b615561565b825181526020808401516159ae8161538f565b828201526040840151838111156159c3575f80fd5b80850194505087601f8501126159d7575f80fd5b835192506159e761561e846155db565b83815288828587010111156159fa575f80fd5b615a09848383018488016152c2565b80604084015250819550615a1e81880161594e565b9450505050509250929050565b81810381811115610caf57610caf6157dc565b5f808335601e19843603018112615a53575f80fd5b8301803591506001600160401b03821115615a6c575f80fd5b602001915036819003821315613731575f80fd5b5f8851615a91818460208d016152c2565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b0c57615b0c6157dc565b505092915050565b5f8235603e19833603018112615543575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615b66575f80fd5b615b6e615589565b615b77836150bb565b81526020808401356001600160401b0380821115615b93575f80fd5b9085019036601f830112615ba5575f80fd5b813581811115615bb757615bb761554d565b8060051b9150615bc88483016155ab565b8181529183018401918481019036841115615be1575f80fd5b938501935b83851015615c0b5784359250615bfb8361538f565b8282529385019390850190615be6565b94860194909452509295945050505050565b5f60208284031215615c2d575f80fd5b611d88826151ad565b5f60208284031215615c46575f80fd5b813560ff81168114611d88575f80fd5b5f6001600160401b0380831681810361581b5761581b6157dc565b5f60208284031215615c81575f80fd5b8151611d88816150ae565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615cd281602a850160208b016152c2565b865190830190615ce981602a840160208b016152c2565b60c087901b6001600160c01b031916602a9290910191820152615d1b603282018660e01b6001600160e01b0319169052565b615d34603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615d578184602088016152c2565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615d8d8184602089016152c2565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615dc88184602088016152c2565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161604838038061604883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615efb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615119565b6104b3565b005b610214610224366004615154565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615119565b6106f6565b61021461026936600461516b565b610701565b61021461027c3660046151b9565b610c2b565b61029461028f366004615154565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615119565b610cd3565b6102146102e93660046151da565b610cde565b6103016102fc36600461521a565b610d9f565b60405190815260200161023f565b61021461031d36600461527f565b610dd4565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d3660046152a7565b61103f565b610294610360366004615154565b611076565b6103015f81565b61021461037a366004615119565b61108a565b610231603081565b610214610395366004615154565b6110b5565b6102146103a836600461527f565b611180565b6103016103bb3660046152c0565b611358565b6102146103ce3660046151da565b611384565b6103015f80516020615e4f83398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b366004615154565b61150d565b6103015f80516020615e6f83398151915281565b610214610442366004615154565b6116f6565b610231601481565b61046261045d366004615154565b611833565b60405161023f9190615355565b6102946202a30081565b6103015f80516020615e2f83398151915281565b61021461049b3660046153e9565b611982565b6103016104ae366004615427565b611a61565b6104be838383611abc565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615ecf8339815191526020526040808220815160e0810190925280545f80516020615e6f83398151915293929190829060ff166005811115610535576105356152e0565b6005811115610546576105466152e0565b815260200160018201805461055a90615492565b80601f016020809104026020016040519081016040528092919081815260200182805461058690615492565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c6152e0565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016154ca565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611dca565b6040518263ffffffff1660e01b81526004016106b091906154d8565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906154ea565b50505050565b6106f0838383611abc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615e6f8339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906154ea565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615501565b6001600160a01b031614610837576108126060840160408501615501565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f610845606085018561551c565b905090505f805b828163ffffffff161015610b2d575f610868606088018861551c565b8363ffffffff1681811061087e5761087e615561565b90506020028101906108909190615575565b61089990615699565b80516040519192505f9160088801916108b191615712565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da91906004016154d8565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615712565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906154ea565b90508086600801835f01516040516109809190615712565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a026152e0565b021790555060208201516001820190610a1b9082615767565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac0911685615836565b8251604051919550610ad191615712565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615849565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff168361586b565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e19565b60400151611f2f565b90505f610b95876120bc565b90505f600282604051610ba89190615712565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906154ea565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612296565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611833565b5190506002816005811115610c7557610c756152e0565b14610c95578060405163170cc93360e21b81526004016104da91906154ca565b6106f083836122d1565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610ccd9083615882565b92915050565b6106f083838361254b565b610ce6612737565b5f80516020615e4f8339815191525f80610cff8461276e565b91509150610d0c82612296565b610d1857505050610d86565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d4657610d466152e0565b03610d6b575f83815260088501602052604081208054919055610d698282612aac565b505b610d8181610d7c846040015161103f565b612b22565b505050505b610d9c60015f80516020615eaf83398151915255565b50565b5f610da8612737565b610db485858585612b58565b9050610dcc60015f80516020615eaf83398151915255565b949350505050565b5f8181525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f83398151915293929190829060ff166003811115610e2157610e216152e0565b6003811115610e3257610e326152e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ea882611833565b9050600183516003811115610ebf57610ebf6152e0565b14610ee0578251604051633b0d540d60e21b81526104da91906004016158a1565b600481516005811115610ef557610ef56152e0565b03610f0b57610f0385612d31565b505050505050565b5f80610f22610f1989611e19565b60400151612f18565b5091509150818414610f4f57846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610f885750806001600160401b03168560a001516001600160401b0316115b15610fb157604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610ccd906001600160401b03841661586b565b5f61108082611833565b6080015192915050565b61109583838361254b565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615e4f8339815191525f6110cd83611833565b51905060048160058111156110e4576110e46152e0565b14611104578060405163170cc93360e21b81526004016104da91906154ca565b5f8381526005830160205260409020546001600160a01b0316331461114a57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612aac565b611188612737565b5f8181525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f83398151915293929190829060ff1660038111156111d5576111d56152e0565b60038111156111e6576111e66152e0565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561125f5761125f6152e0565b14611280578051604051633b0d540d60e21b81526104da91906004016158a1565b600461128f8260400151611833565b5160058111156112a1576112a16152e0565b14611333575f6112b085611e19565b90505f806112c18360400151612f18565b5091509150818460400151146112ed5760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561132f57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61133c83612d31565b505061135460015f80516020615eaf83398151915255565b5050565b5f611361612737565b61136c83338461316e565b9050610ccd60015f80516020615eaf83398151915255565b5f80516020615e6f8339815191525f806113a96113a085611e19565b60400151613446565b91509150806113cf57604051632d07135360e01b815281151560048201526024016104da565b5f828152600684016020526040902080546113e990615492565b90505f0361140d5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff166005811115611433576114336152e0565b14611466575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff16906004016154ca565b5f828152600684016020526040812061147e91615068565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f83398151915293929190829060ff16600381111561155a5761155a6152e0565b600381111561156b5761156b6152e0565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115e4576115e46152e0565b141580156116055750600381516003811115611602576116026152e0565b14155b15611626578051604051633b0d540d60e21b81526104da91906004016158a1565b5f6116348260400151611833565b905080606001516001600160401b03165f03611666576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb611693846040015184606001518560800151611dca565b6040518263ffffffff1660e01b81526004016116af91906154d8565b6020604051808303815f875af11580156116cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ef91906154ea565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615e6f833981519152919061173d90615492565b90505f036117615760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff166005811115611787576117876152e0565b146117ba575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff16906004016154ca565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117f391906004016158bb565b6020604051808303815f875af115801561180f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906154ea565b61183b61509f565b5f8281525f80516020615ecf833981519152602052604090819020815160e0810190925280545f80516020615e6f833981519152929190829060ff166005811115611888576118886152e0565b6005811115611899576118996152e0565b81526020016001820180546118ad90615492565b80601f01602080910402602001604051908101604052809291908181526020018280546118d990615492565b80156119245780601f106118fb57610100808354040283529160200191611924565b820191905f5260205f20905b81548152906001019060200180831161190757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119cb575080546001600160401b03808416911610155b156119e95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a148484613602565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615e6f833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aa49086908690615945565b90815260200160405180910390205491505092915050565b5f8381525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f8339815191529284929091829060ff166003811115611b0a57611b0a6152e0565b6003811115611b1b57611b1b6152e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b9182611833565b9050600283516003811115611ba857611ba86152e0565b14611bc9578251604051633b0d540d60e21b81526104da91906004016158a1565b60208301516001600160a01b03163314611c6c575f828152600585016020526040902054336001600160a01b0390911603611c66575f82815260058501602052604090205460a0820151611c2d91600160b01b90046001600160401b031690615954565b6001600160401b0316421015611c615760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611c6c565b33611125565b600281516005811115611c8157611c816152e0565b03611d5e578615611c9857611c9682876122d1565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611cd1918491611ccc9190615974565b61361c565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d1284613773565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611dc39350505050565b600481516005811115611d7357611d736152e0565b03611da757611d8183613773565b5f898152600786016020526040902055611d9a88612d31565b6001945050505050611dc3565b805160405163170cc93360e21b81526104da91906004016154ca565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e7d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ea4919081019061599f565b9150915080611ec657604051636b2f19e960e01b815260040160405180910390fd5b815115611eec578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f28576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611f6457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b6002811015611fb357611f7b816001615a71565b611f8690600861586b565b61ffff16848281518110611f9c57611f9c615561565b016020015160f81c901b9190911790600101611f67565b5061ffff811615611fdd5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561203857611ff4816003615a71565b611fff90600861586b565b63ffffffff1685612011836002615836565b8151811061202157612021615561565b016020015160f81c901b9190911790600101611fe0565b5063ffffffff81161561205e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120b35761207581601f615a71565b61208090600861586b565b8661208c836006615836565b8151811061209c5761209c615561565b016020015160f81c901b9190911790600101612061565b50949350505050565b60605f808335602085013560146120d887870160408901615501565b6120e5606089018961551c565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61216b606085018561551c565b9050811015611f285781612182606086018661551c565b8381811061219257612192615561565b90506020028101906121a49190615575565b6121ae9080615a84565b90506121bd606087018761551c565b848181106121cd576121cd615561565b90506020028101906121df9190615575565b6121e99080615a84565b6121f6606089018961551c565b8681811061220657612206615561565b90506020028101906122189190615575565b612226906020810190615a84565b61223360608b018b61551c565b8881811061224357612243615561565b90506020028101906122559190615575565b6122669060608101906040016152a7565b60405160200161227c9796959493929190615ac6565b60408051601f19818403018152919052915060010161215e565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561231c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612343919081019061599f565b915091508061236557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123cc91906154ea565b8251146123f2578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561242e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061243d8460400151613910565b915091508187146124645760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615e4f833981519152906001600160401b039081169083161115612521575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612540565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e4f8339815191528161256486613b01565b905061256f86612296565b61257e57600192505050611dc3565b5f8681526005830160205260409020546001600160a01b031633146125a35733611125565b5f86815260058301602052604090205460a08201516125d291600160b01b90046001600160401b031690615954565b6001600160401b03168160c001516001600160401b031610156126195760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126315761262a87866122d1565b905061264f565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126749061103f565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156126dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061270191906154ea565b905080846008015f8a81526020019081526020015f205f8282546127259190615836565b90915550501515979650505050505050565b5f80516020615eaf83398151915280546001190161276857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61277761509f565b5f80516020615e6f8339815191525f806127936113a087611e19565b9150915080156127ba57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127eb576127eb6152e0565b60058111156127fc576127fc6152e0565b815260200160018201805461281090615492565b80601f016020809104026020016040519081016040528092919081815260200182805461283c90615492565b80156128875780601f1061285e57610100808354040283529160200191612887565b820191905f5260205f20905b81548152906001019060200180831161286a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128f2576128f26152e0565b141580156129135750600181516005811115612910576129106152e0565b14155b1561293457805160405163170cc93360e21b81526104da91906004016154ca565b600381516005811115612949576129496152e0565b03612957576004815261295c565b600581525b8360080181602001516040516129729190615712565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156129b6576129b66152e0565b0217905550602082015160018201906129cf9082615767565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a7557612a756152e0565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e2f83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b07575f80fd5b505af1158015612b19573d5f803e3d5ffd5b50505050505050565b5f80516020615e2f83398151915254611354906001600160a01b03168383613de5565b60015f80516020615eaf83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e4f83398151915290600160401b900461ffff9081169086161080612bac575061271061ffff8616115b15612bd057604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c0c576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c1e5750806001015483115b15612c3f5760405163222d164360e21b8152600481018490526024016104da565b5f612c4984613e44565b90505f612c5582610c9f565b90505f612c628983613e67565b90506040518060800160405280612c763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f83398151915293929190829060ff166003811115612d7e57612d7e6152e0565b6003811115612d8f57612d8f6152e0565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612ebd575f84815260058701602052604090205461271090612e6f90600160a01b900461ffff168561586b565b612e799190615882565b915081866008015f8681526020019081526020015f205f828254612e9d9190615836565b90915550612ead90508284615a71565b9050612ebd856020015182612aac565b612ed28560200151610d7c876060015161103f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f4f57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612f9e57612f66816001615a71565b612f7190600861586b565b61ffff16868281518110612f8757612f87615561565b016020015160f81c901b9190911790600101612f52565b5061ffff811615612fc85760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561302357612fdf816003615a71565b612fea90600861586b565b63ffffffff1687612ffc836002615836565b8151811061300c5761300c615561565b016020015160f81c901b9190911790600101612fcb565b5063ffffffff811660031461304b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130a05761306281601f615a71565b61306d90600861586b565b88613079836006615836565b8151811061308957613089615561565b016020015160f81c901b919091179060010161304e565b505f805b60088110156130ff576130b8816007615a71565b6130c390600861586b565b6001600160401b0316896130d8836026615836565b815181106130e8576130e8615561565b016020015160f81c901b91909117906001016130a4565b505f805b600881101561315e57613117816007615a71565b61312290600861586b565b6001600160401b03168a61313783602e615836565b8151811061314757613147615561565b016020015160f81c901b9190911790600101613103565b5091989097509095509350505050565b5f5f80516020615e4f8339815191528161318a61028f85613e44565b90505f61319687611833565b90506131a187612296565b6131c1576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156131d6576131d66152e0565b146131f757805160405163170cc93360e21b81526104da91906004016154ca565b5f8282608001516132089190615954565b905083600201600a9054906101000a90046001600160401b031682604001516132319190615b2f565b6001600160401b0316816001600160401b0316111561326e57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f8061327a8a8461361c565b915091505f8a836040516020016132a892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561333b5761333b6152e0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461347c57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156134cb57613493816001615a71565b61349e90600861586b565b61ffff168582815181106134b4576134b4615561565b016020015160f81c901b919091179060010161347f565b5061ffff8116156134f55760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156135505761350c816003615a71565b61351790600861586b565b63ffffffff1686613529836002615836565b8151811061353957613539615561565b016020015160f81c901b91909117906001016134f8565b5063ffffffff811660021461357857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135cd5761358f81601f615a71565b61359a90600861586b565b876135a6836006615836565b815181106135b6576135b6615561565b016020015160f81c901b919091179060010161357b565b505f866026815181106135e2576135e2615561565b016020015191976001600160f81b03199092161515965090945050505050565b61360a6143df565b6136138261442a565b6113548161449e565b5f8281525f80516020615ecf833981519152602052604081206002015481905f80516020615e6f83398151915290600160801b90046001600160401b03166136648582614506565b5f61366e87614729565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136be8a858b611dca565b6040518263ffffffff1660e01b81526004016136da91906154d8565b6020604051808303815f875af11580156136f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371a91906154ea565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e4f83398151915290505f6137938460400151611833565b90505f6003825160058111156137ab576137ab6152e0565b14806137c957506004825160058111156137c7576137c76152e0565b145b156137d9575060c0810151613816565b6002825160058111156137ee576137ee6152e0565b036137fa575042613816565b815160405163170cc93360e21b81526104da91906004016154ca565b84608001516001600160401b0316816001600160401b03161161383d57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138629061103f565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156138e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390791906154ea565b95945050505050565b5f808251602e1461394657825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b60028110156139955761395d816001615a71565b61396890600861586b565b61ffff1685828151811061397e5761397e615561565b016020015160f81c901b9190911790600101613949565b5061ffff8116156139bf5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a1a576139d6816003615a71565b6139e190600861586b565b63ffffffff16866139f3836002615836565b81518110613a0357613a03615561565b016020015160f81c901b91909117906001016139c2565b5063ffffffff811615613a4057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a9557613a5781601f615a71565b613a6290600861586b565b87613a6e836006615836565b81518110613a7e57613a7e615561565b016020015160f81c901b9190911790600101613a43565b505f805b6008811015613af457613aad816007615a71565b613ab890600861586b565b6001600160401b031688613acd836026615836565b81518110613add57613add615561565b016020015160f81c901b9190911790600101613a99565b5090969095509350505050565b613b0961509f565b5f8281525f80516020615ecf8339815191526020526040808220815160e0810190925280545f80516020615e6f83398151915293929190829060ff166005811115613b5657613b566152e0565b6005811115613b6757613b676152e0565b8152602001600182018054613b7b90615492565b80601f0160208091040260200160405190810160405280929190818152602001828054613ba790615492565b8015613bf25780601f10613bc957610100808354040283529160200191613bf2565b820191905f5260205f20905b815481529060010190602001808311613bd557829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c6057613c606152e0565b14613c93575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016154ca565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cd757613cd76152e0565b021790555060208201516001820190613cf09082615767565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d8e858261361c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061479e565b5f610ccd825f80516020615e2f833981519152546001600160a01b0316906147ff565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613eab57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615e6f83398151915242613eca60608601604087016152a7565b6001600160401b0316111580613f045750613ee86202a30042615836565b613ef860608601604087016152a7565b6001600160401b031610155b15613f3e57613f1960608501604086016152a7565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f53613f4e6060860186615b5a565b614958565b613f63613f4e6080860186615b5a565b6030613f726020860186615a84565b905014613fa457613f866020850185615a84565b6040516326475b2f60e11b81526104da925060040190815260200190565b613fae8480615a84565b90505f03613fdb57613fc08480615a84565b604051633e08a12560e11b81526004016104da929190615b6e565b5f60088201613fea8680615a84565b604051613ff8929190615945565b90815260200160405180910390205414614031576140168480615a84565b60405163a41f772f60e01b81526004016104da929190615b6e565b61403b835f614506565b6040805160e08101909152815481525f90819061414790602081016140608980615a84565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906140a8908a018a615a84565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140f160608a0160408b016152a7565b6001600160401b0316815260200161410c60608a018a615b5a565b61411590615b9c565b815260200161412760808a018a615b5a565b61413090615b9c565b8152602001876001600160401b0316815250614ac1565b5f828152600686016020526040902091935091506141658282615767565b5081600884016141758880615a84565b604051614183929190615945565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141bf9085906004016154d8565b6020604051808303815f875af11580156141db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ff91906154ea565b6040805160e08101909152909150806001815260200161421f8980615a84565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156142ae576142ae6152e0565b0217905550602082015160018201906142c79082615767565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143658880615a84565b604051614373929190615945565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906143b191906152a7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661442857604051631afcd79f60e31b815260040160405180910390fd5b565b6144326143df565b61443b81614cae565b614443614cc7565b610d9c6060820135608083013561446060c0850160a086016152a7565b61447060e0860160c08701615c63565b614481610100870160e08801615c7c565b61010087013561449961014089016101208a01615501565b614cd7565b6144a66143df565b5f80516020615e2f8339815191526001600160a01b0382166144e657604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615e6f8339815191525f6001600160401b03808416908516111561453a576145338385615974565b9050614547565b6145448484615974565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145a95750600184015481516145a5916001600160401b031690615836565b8210155b156145cf576001600160401b0383166060820152818152604081015160208201526145ee565b82816060018181516145e19190615954565b6001600160401b03169052505b60608101516145fe906064615b2f565b602082015160018601546001600160401b0392909216916146299190600160401b900460ff1661586b565b101561465957606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146749190615836565b9052506040810180516001600160401b0387169190614694908390615a71565b905250600184015460408201516064916146b991600160401b90910460ff169061586b565b10156146e0578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615ecf8339815191526020526040812060020180545f80516020615e6f833981519152919060089061477390600160401b90046001600160401b0316615c9c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147b26001600160a01b03841683614e0c565b905080515f141580156147d65750808060200190518101906147d49190615cb7565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614845573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061486991906154ea565b90506148806001600160a01b038516333086614e19565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156148c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e891906154ea565b905081811161494e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139078282615a71565b61496560208201826151da565b63ffffffff161580156149855750614980602082018261551c565b151590505b156149cc5761499760208201826151da565b6149a4602083018361551c565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b6149d9602082018261551c565b90506149e860208301836151da565b63ffffffff161115614a015761499760208201826151da565b60015b614a11602083018361551c565b905081101561135457614a27602083018361551c565b614a32600184615a71565b818110614a4157614a41615561565b9050602002016020810190614a569190615501565b6001600160a01b0316614a6c602084018461551c565b83818110614a7c57614a7c615561565b9050602002016020810190614a919190615501565b6001600160a01b03161015614ab957604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a04565b5f6060826040015151603014614aea5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b2b988a986001989297929690959094909390929101615cd2565b60405160208183030381529060405290505f5b84608001516020015151811015614b9d57818560800151602001518281518110614b6a57614b6a615561565b6020026020010151604051602001614b83929190615d8c565b60408051601f198184030181529190529150600101614b3e565b5060a0840151805160209182015151604051614bbd938593929101615dc2565b60405160208183030381529060405290505f5b8460a001516020015151811015614c2f57818560a00151602001518281518110614bfc57614bfc615561565b6020026020010151604051602001614c15929190615d8c565b60408051601f198184030181529190529150600101614bd0565b5060c0840151604051614c46918391602001615dfd565b6040516020818303038152906040529050600281604051614c679190615712565b602060405180830381855afa158015614c82573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ca591906154ea565b94909350915050565b614cb66143df565b614cbe614e52565b610d9c81614e5a565b614ccf6143df565b614428614f42565b614cdf6143df565b5f80516020615e4f83398151915261ffff85161580614d03575061271061ffff8616115b15614d2757604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614d4b5760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614d5e5750600a60ff8516115b15614d815760405163170db35960e31b815260ff851660048201526024016104da565b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611dc383835f614f4a565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e12565b6144286143df565b614e626143df565b80355f80516020615e6f8339815191529081556014614e876060840160408501615c7c565b60ff161180614ea65750614ea16060830160408401615c7c565b60ff16155b15614eda57614ebb6060830160408401615c7c565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614eea6060830160408401615c7c565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f1b60408301602084016152a7565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b456143df565b606081471015614f6f5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614f8a9190615712565b5f6040518083038185875af1925050503d805f8114614fc4576040519150601f19603f3d011682016040523d82523d5f602084013e614fc9565b606091505b5091509150614fd9868383614fe3565b9695505050505050565b606082614ff857614ff38261503f565b611dc3565b815115801561500f57506001600160a01b0384163b155b1561503857604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611dc3565b80511561504f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461507490615492565b5f825580601f10615083575050565b601f0160209004905f5260205f2090810190610d9c91906150dc565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156150f0575f81556001016150dd565b5090565b8015158114610d9c575f80fd5b803563ffffffff81168114615114575f80fd5b919050565b5f805f6060848603121561512b575f80fd5b83359250602084013561513d816150f4565b915061514b60408501615101565b90509250925092565b5f60208284031215615164575f80fd5b5035919050565b5f806040838503121561517c575f80fd5b82356001600160401b03811115615191575f80fd5b8301608081860312156151a2575f80fd5b91506151b060208401615101565b90509250929050565b5f80604083850312156151ca575f80fd5b823591506151b060208401615101565b5f602082840312156151ea575f80fd5b611dc382615101565b803561ffff81168114615114575f80fd5b80356001600160401b0381168114615114575f80fd5b5f805f806080858703121561522d575f80fd5b84356001600160401b03811115615242575f80fd5b850160a08188031215615253575f80fd5b9350615261602086016151f3565b925061526f60408601615204565b9396929550929360600135925050565b5f8060408385031215615290575f80fd5b61529983615101565b946020939093013593505050565b5f602082840312156152b7575f80fd5b611dc382615204565b5f80604083850312156152d1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b60068110615304576153046152e0565b9052565b5f5b8381101561532257818101518382015260200161530a565b50505f910152565b5f8151808452615341816020860160208601615308565b601f01601f19169290920160200192915050565b602081526153676020820183516152f4565b5f602083015160e0604084015261538261010084018261532a565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d9c575f80fd5b5f808284036101608112156153fc575f80fd5b6101408082121561540b575f80fd5b849350830135905061541c816153d5565b809150509250929050565b5f8060208385031215615438575f80fd5b82356001600160401b038082111561544e575f80fd5b818501915085601f830112615461575f80fd5b81358181111561546f575f80fd5b866020828501011115615480575f80fd5b60209290920196919550909350505050565b600181811c908216806154a657607f821691505b6020821081036154c457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ccd82846152f4565b602081525f611dc3602083018461532a565b5f602082840312156154fa575f80fd5b5051919050565b5f60208284031215615511575f80fd5b8135611dc3816153d5565b5f808335601e19843603018112615531575f80fd5b8301803591506001600160401b0382111561554a575f80fd5b6020019150600581901b360382131561376c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615589575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155c9576155c9615593565b60405290565b604080519081016001600160401b03811182821017156155c9576155c9615593565b604051601f8201601f191681016001600160401b038111828210171561561957615619615593565b604052919050565b5f6001600160401b0382111561563957615639615593565b50601f01601f191660200190565b5f82601f830112615656575f80fd5b813561566961566482615621565b6155f1565b81815284602083860101111561567d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156156a9575f80fd5b6156b16155a7565b82356001600160401b03808211156156c7575f80fd5b6156d336838701615647565b835260208501359150808211156156e8575f80fd5b506156f536828601615647565b60208301525061570760408401615204565b604082015292915050565b5f8251615589818460208701615308565b601f8211156104e357805f5260205f20601f840160051c810160208510156157485750805b601f840160051c820191505b818110156116ef575f8155600101615754565b81516001600160401b0381111561578057615780615593565b6157948161578e8454615492565b84615723565b602080601f8311600181146157c7575f84156157b05750858301515b5f19600386901b1c1916600185901b178555610f03565b5f85815260208120601f198616915b828110156157f5578886015182559484019460019091019084016157d6565b508582101561581257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ccd57610ccd615822565b5f63ffffffff80831681810361586157615861615822565b6001019392505050565b8082028115828204841417610ccd57610ccd615822565b5f8261589c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106158b5576158b56152e0565b91905290565b5f60208083525f84546158cd81615492565b806020870152604060018084165f81146158ee576001811461590a57615937565b60ff19851660408a0152604084151560051b8a01019550615937565b895f5260205f205f5b8581101561592e5781548b8201860152908301908801615913565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f2857611f28615822565b6001600160401b03828116828216039080821115611f2857611f28615822565b8051615114816150f4565b5f80604083850312156159b0575f80fd5b82516001600160401b03808211156159c6575f80fd5b90840190606082870312156159d9575f80fd5b6159e16155a7565b825181526020808401516159f4816153d5565b82820152604084015183811115615a09575f80fd5b80850194505087601f850112615a1d575f80fd5b83519250615a2d61566484615621565b8381528882858701011115615a40575f80fd5b615a4f84838301848801615308565b80604084015250819550615a64818801615994565b9450505050509250929050565b81810381811115610ccd57610ccd615822565b5f808335601e19843603018112615a99575f80fd5b8301803591506001600160401b03821115615ab2575f80fd5b60200191503681900382131561376c575f80fd5b5f8851615ad7818460208d01615308565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b5257615b52615822565b505092915050565b5f8235603e19833603018112615589575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615bac575f80fd5b615bb46155cf565b615bbd83615101565b81526020808401356001600160401b0380821115615bd9575f80fd5b9085019036601f830112615beb575f80fd5b813581811115615bfd57615bfd615593565b8060051b9150615c0e8483016155f1565b8181529183018401918481019036841115615c27575f80fd5b938501935b83851015615c515784359250615c41836153d5565b8282529385019390850190615c2c565b94860194909452509295945050505050565b5f60208284031215615c73575f80fd5b611dc3826151f3565b5f60208284031215615c8c575f80fd5b813560ff81168114611dc3575f80fd5b5f6001600160401b0380831681810361586157615861615822565b5f60208284031215615cc7575f80fd5b8151611dc3816150f4565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d1881602a850160208b01615308565b865190830190615d2f81602a840160208b01615308565b60c087901b6001600160c01b031916602a9290910191820152615d61603282018660e01b6001600160e01b0319169052565b615d7a603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615d9d818460208801615308565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615dd3818460208901615308565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e0e818460208801615308565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -728,7 +729,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) Register // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // -// Solidity: function valueToWeight(uint256 value) pure returns(uint64) +// Solidity: function valueToWeight(uint256 value) view returns(uint64) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ValueToWeight(opts *bind.CallOpts, value *big.Int) (uint64, error) { var out []interface{} err := _ERC20TokenStakingManager.contract.Call(opts, &out, "valueToWeight", value) @@ -745,21 +746,21 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ValueToWeight(o // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // -// Solidity: function valueToWeight(uint256 value) pure returns(uint64) +// Solidity: function valueToWeight(uint256 value) view returns(uint64) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ValueToWeight(value *big.Int) (uint64, error) { return _ERC20TokenStakingManager.Contract.ValueToWeight(&_ERC20TokenStakingManager.CallOpts, value) } // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // -// Solidity: function valueToWeight(uint256 value) pure returns(uint64) +// Solidity: function valueToWeight(uint256 value) view returns(uint64) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ValueToWeight(value *big.Int) (uint64, error) { return _ERC20TokenStakingManager.Contract.ValueToWeight(&_ERC20TokenStakingManager.CallOpts, value) } // WeightToValue is a free data retrieval call binding the contract method 0x62065856. // -// Solidity: function weightToValue(uint64 weight) pure returns(uint256) +// Solidity: function weightToValue(uint64 weight) view returns(uint256) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) WeightToValue(opts *bind.CallOpts, weight uint64) (*big.Int, error) { var out []interface{} err := _ERC20TokenStakingManager.contract.Call(opts, &out, "weightToValue", weight) @@ -776,14 +777,14 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) WeightToValue(o // WeightToValue is a free data retrieval call binding the contract method 0x62065856. // -// Solidity: function weightToValue(uint64 weight) pure returns(uint256) +// Solidity: function weightToValue(uint64 weight) view returns(uint256) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) WeightToValue(weight uint64) (*big.Int, error) { return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } // WeightToValue is a free data retrieval call binding the contract method 0x62065856. // -// Solidity: function weightToValue(uint64 weight) pure returns(uint256) +// Solidity: function weightToValue(uint64 weight) view returns(uint256) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightToValue(weight uint64) (*big.Int, error) { return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } @@ -935,23 +936,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Forc return _ERC20TokenStakingManager.Contract.ForceInitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xf09969ae. +// Initialize is a paid mutator transaction binding the contract method 0xf74c607b. // -// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,uint256,address) settings, address token) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings PoSValidatorManagerSettings, token common.Address) (*types.Transaction, error) { return _ERC20TokenStakingManager.contract.Transact(opts, "initialize", settings, token) } -// Initialize is a paid mutator transaction binding the contract method 0xf09969ae. +// Initialize is a paid mutator transaction binding the contract method 0xf74c607b. // -// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,uint256,address) settings, address token) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) Initialize(settings PoSValidatorManagerSettings, token common.Address) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.Initialize(&_ERC20TokenStakingManager.TransactOpts, settings, token) } -// Initialize is a paid mutator transaction binding the contract method 0xf09969ae. +// Initialize is a paid mutator transaction binding the contract method 0xf74c607b. // -// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,uint256,address) settings, address token) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings, token common.Address) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.Initialize(&_ERC20TokenStakingManager.TransactOpts, settings, token) } diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 3ad4dc293..e15570fc3 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -50,6 +50,7 @@ type PoSValidatorManagerSettings struct { MinimumStakeDuration uint64 MinimumDelegationFeeBips uint16 MaximumStakeMultiplier uint8 + WeightToValueFactor *big.Int RewardCalculator common.Address } @@ -90,8 +91,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d0d380380615d0d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615bc08061014d5f395ff3fe6080604052600436106101f1575f3560e01c806376f7862111610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063b771b3bc14610515578063ba3a4b971461052f578063bc5fbfec1461054e578063bee0a03f1461056e575f80fd5b8063a3a65e48116100d8578063a3a65e48146104c3578063a9778a7a14610345578063af2f5feb146104e2578063afb98096146104f5575f80fd5b806376f78621146104525780638280a25a1461047157806393e245981461048557806398f3e2b4146104a4575f80fd5b8063329c3e12116101895780635297fae6116101595780635297fae6146103ab57806360305d62146103ca57806362065856146103f357806366435abf14610420578063732214f81461043f575f80fd5b8063329c3e121461031357806335455ded146103455780633a1cfff61461036d578063467ef06f1461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806320e555651461029e57806325e1c776146102bd5780632e2194d8146102dc575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614e77565b610615565b005b348015610221575f80fd5b50610214610230366004614eb2565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614e77565b610858565b34801561028a575f80fd5b50610214610299366004614ec9565b610863565b3480156102a9575f80fd5b506102146102b8366004614f17565b610d8d565b3480156102c8575f80fd5b506102146102d7366004614f2e565b610e6a565b3480156102e7575f80fd5b506102fb6102f6366004614eb2565b610ede565b6040516001600160401b039091168152602001610257565b34801561031e575f80fd5b5061032d6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610350575f80fd5b5061035a61271081565b60405161ffff9091168152602001610257565b348015610378575f80fd5b50610214610387366004614e77565b610ef4565b348015610397575f80fd5b506102146103a6366004614f4f565b610eff565b3480156103b6575f80fd5b506102146103c5366004614f68565b610fc1565b3480156103d5575f80fd5b506103de601481565b60405163ffffffff9091168152602001610257565b3480156103fe575f80fd5b5061041261040d366004614fa6565b61122c565b604051908152602001610257565b34801561042b575f80fd5b506102fb61043a366004614eb2565b611245565b34801561044a575f80fd5b506104125f81565b34801561045d575f80fd5b5061021461046c366004614e77565b611259565b34801561047c575f80fd5b50610249603081565b348015610490575f80fd5b5061021461049f366004614eb2565b611284565b3480156104af575f80fd5b506102146104be366004614f68565b61134f565b3480156104ce575f80fd5b506102146104dd366004614f4f565b611527565b6104126104f0366004614fd0565b6116b0565b348015610500575f80fd5b506104125f80516020615b3483398151915281565b348015610520575f80fd5b5061032d6005600160991b0181565b34801561053a575f80fd5b50610214610549366004614eb2565b6116e4565b348015610559575f80fd5b506104125f80516020615b5483398151915281565b348015610579575f80fd5b50610214610588366004614eb2565b6118cd565b61041261059b366004614eb2565b611a0a565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614eb2565b611a3b565b6040516102579190615099565b3480156105eb575f80fd5b506102fb6202a30081565b348015610601575f80fd5b50610412610610366004615119565b611b8a565b610620838383611be5565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615b948339815191526020526040808220815160e0810190925280545f80516020615b5483398151915293929190829060ff16600581111561069757610697615024565b60058111156106a8576106a8615024565b81526020016001820180546106bc90615184565b80601f01602080910402602001604051908101604052809291908181526020018280546106e890615184565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e615024565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151b6565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611eec565b6040518263ffffffff1660e01b815260040161081291906151c4565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906151d6565b50505050565b610852838383611be5565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615b548339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c91906151d6565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b306109566060850160408601615201565b6001600160a01b031614610999576109746060840160408501615201565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a7606085018561521c565b905090505f805b828163ffffffff161015610c8f575f6109ca606088018861521c565b8363ffffffff168181106109e0576109e0615261565b90506020028101906109f29190615275565b6109fb90615399565b80516040519192505f916008880191610a1391615412565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c91906004016151c4565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c91615412565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca91906151d6565b90508086600801835f0151604051610ae29190615412565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b64615024565b021790555060208201516001820190610b7d9082615467565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c22911685615536565b8251604051919550610c3391615412565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c8890615549565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff168361556b565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611f3b565b60400151612051565b90505f610cf7876121de565b90505f600282604051610d0a9190615412565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d4891906151d6565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610dd6575080546001600160401b03808416911610155b15610df45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610e1e836123b8565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e73826123c9565b610e93576040516330efa98b60e01b81526004810183905260240161063c565b5f610e9d83611a3b565b5190506002816005811115610eb457610eb4615024565b14610ed4578060405163170cc93360e21b815260040161063c91906151b6565b6108528383612404565b5f610eee64e8d4a5100083615582565b92915050565b61085283838361267e565b610f0761286a565b5f80516020615b348339815191525f80610f20846128a1565b91509150610f2d826123c9565b610f3957505050610fa8565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f6857610f68615024565b03610f8d575f83815260078501602052604081208054919055610f8b8282612bdf565b505b610fa381610f9e846040015161122c565b612c3d565b505050505b610fbe60015f80516020615b7483398151915255565b50565b5f8181525f80516020615b148339815191526020526040808220815160e0810190925280545f80516020615b3483398151915293929190829060ff16600381111561100e5761100e615024565b600381111561101f5761101f615024565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61109582611a3b565b90506001835160038111156110ac576110ac615024565b146110cd578251604051633b0d540d60e21b815261063c91906004016155a1565b6004815160058111156110e2576110e2615024565b036110f8576110f085612c63565b505050505050565b5f8061110f61110689611f3b565b60400151612e4a565b509150915081841461113c57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806111755750806001600160401b03168560a001516001600160401b0316115b1561119e57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610eee6001600160401b03831664e8d4a5100061556b565b5f61124f82611a3b565b6080015192915050565b61126483838361267e565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615b348339815191525f61129c83611a3b565b51905060048160058111156112b3576112b3615024565b146112d3578060405163170cc93360e21b815260040161063c91906151b6565b5f8381526004830160205260409020546001600160a01b0316331461131957335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260078301602090815260408083208054908490556004860190925290912054610852906001600160a01b031682612bdf565b61135761286a565b5f8181525f80516020615b148339815191526020526040808220815160e0810190925280545f80516020615b3483398151915293929190829060ff1660038111156113a4576113a4615024565b60038111156113b5576113b5615024565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561142e5761142e615024565b1461144f578051604051633b0d540d60e21b815261063c91906004016155a1565b600461145e8260400151611a3b565b51600581111561147057611470615024565b14611502575f61147f85611f3b565b90505f806114908360400151612e4a565b5091509150818460400151146114bc5760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b031611156114fe57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61150b83612c63565b505061152360015f80516020615b7483398151915255565b5050565b5f80516020615b548339815191525f8061154c61154385611f3b565b604001516130a0565b915091508061157257604051632d07135360e01b8152811515600482015260240161063c565b5f8281526006840160205260409020805461158c90615184565b90505f036115b05760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff1660058111156115d6576115d6615024565b14611609575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151b6565b5f828152600684016020526040812061162191614dcb565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116b961286a565b6116c58484843461325c565b90506116dd60015f80516020615b7483398151915255565b9392505050565b5f8181525f80516020615b148339815191526020526040808220815160e0810190925280545f80516020615b3483398151915293929190829060ff16600381111561173157611731615024565b600381111561174257611742615024565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117bb576117bb615024565b141580156117dc57506003815160038111156117d9576117d9615024565b14155b156117fd578051604051633b0d540d60e21b815261063c91906004016155a1565b5f61180b8260400151611a3b565b905080606001516001600160401b03165f0361183d576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb61186a846040015184606001518560800151611eec565b6040518263ffffffff1660e01b815260040161188691906151c4565b6020604051808303815f875af11580156118a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c691906151d6565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615b54833981519152919061191490615184565b90505f036119385760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff16600581111561195e5761195e615024565b14611991575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151b6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119ca91906004016155bb565b6020604051808303815f875af11580156119e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064591906151d6565b5f611a1361286a565b611a1e82333461342a565b9050611a3660015f80516020615b7483398151915255565b919050565b611a43614e02565b5f8281525f80516020615b94833981519152602052604090819020815160e0810190925280545f80516020615b54833981519152929190829060ff166005811115611a9057611a90615024565b6005811115611aa157611aa1615024565b8152602001600182018054611ab590615184565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae190615184565b8015611b2c5780601f10611b0357610100808354040283529160200191611b2c565b820191905f5260205f20905b815481529060010190602001808311611b0f57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615b54833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611bcd9086908690615645565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b148339815191526020526040808220815160e0810190925280545f80516020615b348339815191529284929091829060ff166003811115611c3357611c33615024565b6003811115611c4457611c44615024565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611cba82611a3b565b9050600283516003811115611cd157611cd1615024565b14611cf2578251604051633b0d540d60e21b815261063c91906004016155a1565b60208301516001600160a01b03163314611d95575f828152600485016020526040902054336001600160a01b0390911603611d8f575f82815260048501602052604090205460a0820151611d5691600160b01b90046001600160401b031690615654565b6001600160401b0316421015611d8a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611d95565b336112f4565b600281516005811115611daa57611daa615024565b03611e87578615611dc157611dbf8287612404565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611dfa918491611df59190615674565b6136ff565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e3b84613856565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116dd9350505050565b600481516005811115611e9c57611e9c615024565b03611ed057611eaa83613856565b5f898152600686016020526040902055611ec388612c63565b60019450505050506116dd565b805160405163170cc93360e21b815261063c91906004016151b6565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f9f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fc6919081019061569f565b9150915080611fe857604051636b2f19e960e01b815260040160405180910390fd5b81511561200e578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b03161561204a576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461208657815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b60028110156120d55761209d816001615771565b6120a890600861556b565b61ffff168482815181106120be576120be615261565b016020015160f81c901b9190911790600101612089565b5061ffff8116156120ff5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561215a57612116816003615771565b61212190600861556b565b63ffffffff1685612133836002615536565b8151811061214357612143615261565b016020015160f81c901b9190911790600101612102565b5063ffffffff81161561218057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121d55761219781601f615771565b6121a290600861556b565b866121ae836006615536565b815181106121be576121be615261565b016020015160f81c901b9190911790600101612183565b50949350505050565b60605f808335602085013560146121fa87870160408901615201565b612207606089018961521c565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61228d606085018561521c565b905081101561204a57816122a4606086018661521c565b838181106122b4576122b4615261565b90506020028101906122c69190615275565b6122d09080615784565b90506122df606087018761521c565b848181106122ef576122ef615261565b90506020028101906123019190615275565b61230b9080615784565b612318606089018961521c565b8681811061232857612328615261565b905060200281019061233a9190615275565b612348906020810190615784565b61235560608b018b61521c565b8881811061236557612365615261565b90506020028101906123779190615275565b612388906060810190604001614fa6565b60405160200161239e97969594939291906157c6565b60408051601f198184030181529190529150600101612280565b6123c06139f4565b610fbe81613a3f565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561244f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612476919081019061569f565b915091508061249857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124ff91906151d6565b825114612525578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612561576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806125708460400151613aad565b915091508187146125975760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615b34833981519152906001600160401b039081169083161115612654575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612673565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b348339815191528161269786613c9e565b90506126a2866123c9565b6126b1576001925050506116dd565b5f8681526004830160205260409020546001600160a01b031633146126d657336112f4565b5f86815260048301602052604090205460a082015161270591600160b01b90046001600160401b031690615654565b6001600160401b03168160c001516001600160401b0316101561274c5760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127645761275d8786612404565b9050612782565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b031690634f22429f906127a79061122c565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612810573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061283491906151d6565b905080846007015f8a81526020019081526020015f205f8282546128589190615536565b90915550501515979650505050505050565b5f80516020615b7483398151915280546001190161289b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128aa614e02565b5f80516020615b548339815191525f806128c661154387611f3b565b9150915080156128ed57604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561291e5761291e615024565b600581111561292f5761292f615024565b815260200160018201805461294390615184565b80601f016020809104026020016040519081016040528092919081815260200182805461296f90615184565b80156129ba5780601f10612991576101008083540402835291602001916129ba565b820191905f5260205f20905b81548152906001019060200180831161299d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a2557612a25615024565b14158015612a465750600181516005811115612a4357612a43615024565b14155b15612a6757805160405163170cc93360e21b815261063c91906004016151b6565b600381516005811115612a7c57612a7c615024565b03612a8a5760048152612a8f565b600581525b836008018160200151604051612aa59190615412565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612ae957612ae9615024565b021790555060208201516001820190612b029082615467565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ba857612ba8615024565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c2b575f80fd5b505af11580156110f0573d5f803e3d5ffd5b6115236001600160a01b03831682613f82565b60015f80516020615b7483398151915255565b5f8181525f80516020615b148339815191526020526040808220815160e0810190925280545f80516020615b3483398151915293929190829060ff166003811115612cb057612cb0615024565b6003811115612cc157612cc1615024565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612def575f84815260048701602052604090205461271090612da190600160a01b900461ffff168561556b565b612dab9190615582565b915081866007015f8681526020019081526020015f205f828254612dcf9190615536565b90915550612ddf90508284615771565b9050612def856020015182612bdf565b612e048560200151610f9e876060015161122c565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e8157835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612ed057612e98816001615771565b612ea390600861556b565b61ffff16868281518110612eb957612eb9615261565b016020015160f81c901b9190911790600101612e84565b5061ffff811615612efa5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f5557612f11816003615771565b612f1c90600861556b565b63ffffffff1687612f2e836002615536565b81518110612f3e57612f3e615261565b016020015160f81c901b9190911790600101612efd565b5063ffffffff8116600314612f7d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fd257612f9481601f615771565b612f9f90600861556b565b88612fab836006615536565b81518110612fbb57612fbb615261565b016020015160f81c901b9190911790600101612f80565b505f805b600881101561303157612fea816007615771565b612ff590600861556b565b6001600160401b03168961300a836026615536565b8151811061301a5761301a615261565b016020015160f81c901b9190911790600101612fd6565b505f805b600881101561309057613049816007615771565b61305490600861556b565b6001600160401b03168a61306983602e615536565b8151811061307957613079615261565b016020015160f81c901b9190911790600101613035565b5091989097509095509350505050565b5f8082516027146130d657825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b6002811015613125576130ed816001615771565b6130f890600861556b565b61ffff1685828151811061310e5761310e615261565b016020015160f81c901b91909117906001016130d9565b5061ffff81161561314f5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131aa57613166816003615771565b61317190600861556b565b63ffffffff1686613183836002615536565b8151811061319357613193615261565b016020015160f81c901b9190911790600101613152565b5063ffffffff81166002146131d257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613227576131e981601f615771565b6131f490600861556b565b87613200836006615536565b8151811061321057613210615261565b016020015160f81c901b91909117906001016131d5565b505f8660268151811061323c5761323c615261565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b3483398151915290600160401b900461ffff90811690861610806132b0575061271061ffff8616115b156132d457604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613310576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133225750806001015483115b156133435760405163222d164360e21b81526004810184905260240161063c565b825f61334e82610ede565b90505f61335b8983614015565b9050604051806080016040528061336f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615b348339815191528161344384610ede565b90505f61344f87611a3b565b905061345a876123c9565b61347a576040516330efa98b60e01b81526004810188905260240161063c565b60028151600581111561348f5761348f615024565b146134b057805160405163170cc93360e21b815261063c91906004016151b6565b5f8282608001516134c19190615654565b905083600201600a9054906101000a90046001600160401b031682604001516134ea919061582f565b6001600160401b0316816001600160401b0316111561352757604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135338a846136ff565b915091505f8a8360405160200161356192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135f4576135f4615024565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615b94833981519152602052604081206002015481905f80516020615b5483398151915290600160801b90046001600160401b0316613747858261458d565b5f613751876147b0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137a18a858b611eec565b6040518263ffffffff1660e01b81526004016137bd91906151c4565b6020604051808303815f875af11580156137d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137fd91906151d6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b3483398151915290505f6138768460400151611a3b565b90505f60038251600581111561388e5761388e615024565b14806138ac57506004825160058111156138aa576138aa615024565b145b156138bc575060c08101516138f9565b6002825160058111156138d1576138d1615024565b036138dd5750426138f9565b815160405163170cc93360e21b815261063c91906004016151b6565b84608001516001600160401b0316816001600160401b03161161392057505f949350505050565b600383015460608601516001600160a01b0390911690634f22429f906139459061122c565b60a085015160808901516040808b01515f90815260048a81016020529082902060010154915160e087901b6001600160e01b0319168152908101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156139c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139eb91906151d6565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a3d57604051631afcd79f60e31b815260040160405180910390fd5b565b613a476139f4565b613a5081614825565b613a5861483e565b610fbe60608201356080830135613a7560c0850160a08601614fa6565b613a8560e0860160c0870161585a565b613a96610100870160e08801615873565b613aa861012088016101008901615201565b61484e565b5f808251602e14613ae357825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b3257613afa816001615771565b613b0590600861556b565b61ffff16858281518110613b1b57613b1b615261565b016020015160f81c901b9190911790600101613ae6565b5061ffff811615613b5c5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613bb757613b73816003615771565b613b7e90600861556b565b63ffffffff1686613b90836002615536565b81518110613ba057613ba0615261565b016020015160f81c901b9190911790600101613b5f565b5063ffffffff811615613bdd57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c3257613bf481601f615771565b613bff90600861556b565b87613c0b836006615536565b81518110613c1b57613c1b615261565b016020015160f81c901b9190911790600101613be0565b505f805b6008811015613c9157613c4a816007615771565b613c5590600861556b565b6001600160401b031688613c6a836026615536565b81518110613c7a57613c7a615261565b016020015160f81c901b9190911790600101613c36565b5090969095509350505050565b613ca6614e02565b5f8281525f80516020615b948339815191526020526040808220815160e0810190925280545f80516020615b5483398151915293929190829060ff166005811115613cf357613cf3615024565b6005811115613d0457613d04615024565b8152602001600182018054613d1890615184565b80601f0160208091040260200160405190810160405280929190818152602001828054613d4490615184565b8015613d8f5780601f10613d6657610100808354040283529160200191613d8f565b820191905f5260205f20905b815481529060010190602001808311613d7257829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dfd57613dfd615024565b14613e30575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151b6565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e7457613e74615024565b021790555060208201516001820190613e8d9082615467565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f2b85826136ff565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613fa55760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fee576040519150601f19603f3d011682016040523d82523d5f602084013e613ff3565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661405957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615b54833981519152426140786060860160408701614fa6565b6001600160401b03161115806140b257506140966202a30042615536565b6140a66060860160408701614fa6565b6001600160401b031610155b156140ec576140c76060850160408601614fa6565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6141016140fc6060860186615893565b61497d565b6141116140fc6080860186615893565b60306141206020860186615784565b905014614152576141346020850185615784565b6040516326475b2f60e11b815261063c925060040190815260200190565b61415c8480615784565b90505f036141895761416e8480615784565b604051633e08a12560e11b815260040161063c9291906158a7565b5f600882016141988680615784565b6040516141a6929190615645565b908152602001604051809103902054146141df576141c48480615784565b60405163a41f772f60e01b815260040161063c9291906158a7565b6141e9835f61458d565b6040805160e08101909152815481525f9081906142f5906020810161420e8980615784565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614256908a018a615784565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161429f60608a0160408b01614fa6565b6001600160401b031681526020016142ba60608a018a615893565b6142c3906158d5565b81526020016142d560808a018a615893565b6142de906158d5565b8152602001876001600160401b0316815250614ae6565b5f828152600686016020526040902091935091506143138282615467565b5081600884016143238880615784565b604051614331929190615645565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061436d9085906004016151c4565b6020604051808303815f875af1158015614389573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143ad91906151d6565b6040805160e0810190915290915080600181526020016143cd8980615784565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561445c5761445c615024565b0217905550602082015160018201906144759082615467565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806145138880615784565b604051614521929190615645565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061455f9190614fa6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615b548339815191525f6001600160401b0380841690851611156145c1576145ba8385615674565b90506145ce565b6145cb8484615674565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061463057506001840154815161462c916001600160401b031690615536565b8210155b15614656576001600160401b038316606082015281815260408101516020820152614675565b82816060018181516146689190615654565b6001600160401b03169052505b606081015161468590606461582f565b602082015160018601546001600160401b0392909216916146b09190600160401b900460ff1661556b565b10156146e057606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b0316816040018181516146fb9190615536565b9052506040810180516001600160401b038716919061471b908390615771565b9052506001840154604082015160649161474091600160401b90910460ff169061556b565b1015614767578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615b948339815191526020526040812060020180545f80516020615b5483398151915291906008906147fa90600160401b90046001600160401b031661599c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61482d6139f4565b614835614cd3565b610fbe81614cdb565b6148466139f4565b613a3d614dc3565b6148566139f4565b5f80516020615b3483398151915261ffff8416158061487a575061271061ffff8516115b1561489e57604051635f12e6c360e11b815261ffff8516600482015260240161063c565b858711156148c25760405163222d164360e21b81526004810188905260240161063c565b60ff831615806148d55750600a60ff8416115b156148f85760405163170db35960e31b815260ff8416600482015260240161063c565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b61498a6020820182614f4f565b63ffffffff161580156149aa57506149a5602082018261521c565b151590505b156149f1576149bc6020820182614f4f565b6149c9602083018361521c565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149fe602082018261521c565b9050614a0d6020830183614f4f565b63ffffffff161115614a26576149bc6020820182614f4f565b60015b614a36602083018361521c565b905081101561152357614a4c602083018361521c565b614a57600184615771565b818110614a6657614a66615261565b9050602002016020810190614a7b9190615201565b6001600160a01b0316614a91602084018461521c565b83818110614aa157614aa1615261565b9050602002016020810190614ab69190615201565b6001600160a01b03161015614ade57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a29565b5f6060826040015151603014614b0f5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b50988a9860019892979296909590949093909291016159b7565b60405160208183030381529060405290505f5b84608001516020015151811015614bc257818560800151602001518281518110614b8f57614b8f615261565b6020026020010151604051602001614ba8929190615a71565b60408051601f198184030181529190529150600101614b63565b5060a0840151805160209182015151604051614be2938593929101615aa7565b60405160208183030381529060405290505f5b8460a001516020015151811015614c5457818560a00151602001518281518110614c2157614c21615261565b6020026020010151604051602001614c3a929190615a71565b60408051601f198184030181529190529150600101614bf5565b5060c0840151604051614c6b918391602001615ae2565b6040516020818303038152906040529050600281604051614c8c9190615412565b602060405180830381855afa158015614ca7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614cca91906151d6565b94909350915050565b613a3d6139f4565b614ce36139f4565b80355f80516020615b548339815191529081556014614d086060840160408501615873565b60ff161180614d275750614d226060830160408401615873565b60ff16155b15614d5b57614d3c6060830160408401615873565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614d6b6060830160408401615873565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d9c6040830160208401614fa6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c506139f4565b508054614dd790615184565b5f825580601f10614de6575050565b601f0160209004905f5260205f2090810190610fbe9190614e3f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e53575f8155600101614e40565b5090565b8015158114610fbe575f80fd5b803563ffffffff81168114611a36575f80fd5b5f805f60608486031215614e89575f80fd5b833592506020840135614e9b81614e57565b9150614ea960408501614e64565b90509250925092565b5f60208284031215614ec2575f80fd5b5035919050565b5f8060408385031215614eda575f80fd5b82356001600160401b03811115614eef575f80fd5b830160808186031215614f00575f80fd5b9150614f0e60208401614e64565b90509250929050565b5f6101208284031215614f28575f80fd5b50919050565b5f8060408385031215614f3f575f80fd5b82359150614f0e60208401614e64565b5f60208284031215614f5f575f80fd5b6116dd82614e64565b5f8060408385031215614f79575f80fd5b614f8283614e64565b946020939093013593505050565b80356001600160401b0381168114611a36575f80fd5b5f60208284031215614fb6575f80fd5b6116dd82614f90565b803561ffff81168114611a36575f80fd5b5f805f60608486031215614fe2575f80fd5b83356001600160401b03811115614ff7575f80fd5b840160a08187031215615008575f80fd5b925061501660208501614fbf565b9150614ea960408501614f90565b634e487b7160e01b5f52602160045260245ffd5b6006811061504857615048615024565b9052565b5f5b8381101561506657818101518382015260200161504e565b50505f910152565b5f815180845261508581602086016020860161504c565b601f01601f19169290920160200192915050565b602081526150ab602082018351615038565b5f602083015160e060408401526150c661010084018261506e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f806020838503121561512a575f80fd5b82356001600160401b0380821115615140575f80fd5b818501915085601f830112615153575f80fd5b813581811115615161575f80fd5b866020828501011115615172575f80fd5b60209290920196919550909350505050565b600181811c9082168061519857607f821691505b602082108103614f2857634e487b7160e01b5f52602260045260245ffd5b60208101610eee8284615038565b602081525f6116dd602083018461506e565b5f602082840312156151e6575f80fd5b5051919050565b6001600160a01b0381168114610fbe575f80fd5b5f60208284031215615211575f80fd5b81356116dd816151ed565b5f808335601e19843603018112615231575f80fd5b8301803591506001600160401b0382111561524a575f80fd5b6020019150600581901b360382131561384f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615289575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152c9576152c9615293565b60405290565b604080519081016001600160401b03811182821017156152c9576152c9615293565b604051601f8201601f191681016001600160401b038111828210171561531957615319615293565b604052919050565b5f6001600160401b0382111561533957615339615293565b50601f01601f191660200190565b5f82601f830112615356575f80fd5b813561536961536482615321565b6152f1565b81815284602083860101111561537d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153a9575f80fd5b6153b16152a7565b82356001600160401b03808211156153c7575f80fd5b6153d336838701615347565b835260208501359150808211156153e8575f80fd5b506153f536828601615347565b60208301525061540760408401614f90565b604082015292915050565b5f825161528981846020870161504c565b601f82111561064557805f5260205f20601f840160051c810160208510156154485750805b601f840160051c820191505b818110156118c6575f8155600101615454565b81516001600160401b0381111561548057615480615293565b6154948161548e8454615184565b84615423565b602080601f8311600181146154c7575f84156154b05750858301515b5f19600386901b1c1916600185901b1785556110f0565b5f85815260208120601f198616915b828110156154f5578886015182559484019460019091019084016154d6565b508582101561551257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610eee57610eee615522565b5f63ffffffff80831681810361556157615561615522565b6001019392505050565b8082028115828204841417610eee57610eee615522565b5f8261559c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155b5576155b5615024565b91905290565b5f60208083525f84546155cd81615184565b806020870152604060018084165f81146155ee576001811461560a57615637565b60ff19851660408a0152604084151560051b8a01019550615637565b895f5260205f205f5b8581101561562e5781548b8201860152908301908801615613565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561204a5761204a615522565b6001600160401b0382811682821603908082111561204a5761204a615522565b8051611a3681614e57565b5f80604083850312156156b0575f80fd5b82516001600160401b03808211156156c6575f80fd5b90840190606082870312156156d9575f80fd5b6156e16152a7565b825181526020808401516156f4816151ed565b82820152604084015183811115615709575f80fd5b80850194505087601f85011261571d575f80fd5b8351925061572d61536484615321565b8381528882858701011115615740575f80fd5b61574f8483830184880161504c565b80604084015250819550615764818801615694565b9450505050509250929050565b81810381811115610eee57610eee615522565b5f808335601e19843603018112615799575f80fd5b8301803591506001600160401b038211156157b2575f80fd5b60200191503681900382131561384f575f80fd5b5f88516157d7818460208d0161504c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461585257615852615522565b505092915050565b5f6020828403121561586a575f80fd5b6116dd82614fbf565b5f60208284031215615883575f80fd5b813560ff811681146116dd575f80fd5b5f8235603e19833603018112615289575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156158e5575f80fd5b6158ed6152cf565b6158f683614e64565b81526020808401356001600160401b0380821115615912575f80fd5b9085019036601f830112615924575f80fd5b81358181111561593657615936615293565b8060051b91506159478483016152f1565b8181529183018401918481019036841115615960575f80fd5b938501935b8385101561598a578435925061597a836151ed565b8282529385019390850190615965565b94860194909452509295945050505050565b5f6001600160401b0380831681810361556157615561615522565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516159fd81602a850160208b0161504c565b865190830190615a1481602a840160208b0161504c565b60c087901b6001600160c01b031916602a9290910191820152615a46603282018660e01b6001600160e01b0319169052565b615a5f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a8281846020880161504c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615ab881846020890161504c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615af381846020880161504c565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615d53380380615d5383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c068061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614ebd565b610615565b005b348015610221575f80fd5b50610214610230366004614ef8565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614ebd565b610858565b34801561028a575f80fd5b50610214610299366004614f0f565b610863565b3480156102a9575f80fd5b506102146102b8366004614f5d565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614ef8565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614ebd565b610e35565b348015610378575f80fd5b50610214610387366004614f7e565b610e40565b348015610397575f80fd5b506102146103a6366004614f97565b610f01565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004614fd5565b61116c565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614ef8565b6111a3565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614ebd565b6111b7565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614ef8565b6111e2565b348015610490575f80fd5b5061021461049f366004614f97565b6112ad565b3480156104af575f80fd5b506102146104be366004614f7e565b611485565b6103f36104d1366004614fff565b61160e565b3480156104e1575f80fd5b506103f35f80516020615b5a83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614ef8565b611642565b34801561053a575f80fd5b506103f35f80516020615b7a83398151915281565b34801561055a575f80fd5b50610214610569366004614ef8565b61182b565b348015610579575f80fd5b50610214610588366004615053565b611968565b6103f361059b366004614ef8565b611a45565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614ef8565b611a76565b60405161025791906150df565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f361061036600461515f565b611bc5565b610620838383611c20565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615bda8339815191526020526040808220815160e0810190925280545f80516020615b7a83398151915293929190829060ff1660058111156106975761069761506a565b60058111156106a8576106a861506a565b81526020016001820180546106bc906151ca565b80601f01602080910402602001604051908101604052809291908181526020018280546106e8906151ca565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e61506a565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151fc565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f27565b6040518263ffffffff1660e01b8152600401610812919061520a565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061521c565b50505050565b610852838383611c20565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615b7a8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c919061521c565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b306109566060850160408601615247565b6001600160a01b031614610999576109746060840160408501615247565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a76060850185615262565b905090505f805b828163ffffffff161015610c8f575f6109ca6060880188615262565b8363ffffffff168181106109e0576109e06152a7565b90506020028101906109f291906152bb565b6109fb906153df565b80516040519192505f916008880191610a1391615458565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161520a565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c91615458565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca919061521c565b90508086600801835f0151604051610ae29190615458565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b6461506a565b021790555060208201516001820190610b7d90826154ad565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c2291168561557c565b8251604051919550610c3391615458565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c889061558f565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836155b1565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611f76565b6040015161208c565b90505f610cf787612219565b90505f600282604051610d0a9190615458565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d48919061521c565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d96826123f3565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a76565b5190506002816005811115610dd757610dd761506a565b14610df7578060405163170cc93360e21b815260040161063c91906151fc565b610852838361242e565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e2f90836155c8565b92915050565b6108528383836126a8565b610e48612894565b5f80516020615b5a8339815191525f80610e61846128cb565b91509150610e6e826123f3565b610e7a57505050610ee8565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ea857610ea861506a565b03610ecd575f83815260088501602052604081208054919055610ecb8282612c09565b505b610ee381610ede846040015161116c565b612c67565b505050505b610efe60015f80516020615bba83398151915255565b50565b5f8181525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a83398151915293929190829060ff166003811115610f4e57610f4e61506a565b6003811115610f5f57610f5f61506a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610fd582611a76565b9050600183516003811115610fec57610fec61506a565b1461100d578251604051633b0d540d60e21b815261063c91906004016155e7565b6004815160058111156110225761102261506a565b036110385761103085612c8d565b505050505050565b5f8061104f61104689611f76565b60400151612e74565b509150915081841461107c57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110b55750806001600160401b03168560a001516001600160401b0316115b156110de57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e2f906001600160401b0384166155b1565b5f6111ad82611a76565b6080015192915050565b6111c28383836126a8565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615b5a8339815191525f6111fa83611a76565b51905060048160058111156112115761121161506a565b14611231578060405163170cc93360e21b815260040161063c91906151fc565b5f8381526005830160205260409020546001600160a01b0316331461127757335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c09565b6112b5612894565b5f8181525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a83398151915293929190829060ff1660038111156113025761130261506a565b60038111156113135761131361506a565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561138c5761138c61506a565b146113ad578051604051633b0d540d60e21b815261063c91906004016155e7565b60046113bc8260400151611a76565b5160058111156113ce576113ce61506a565b14611460575f6113dd85611f76565b90505f806113ee8360400151612e74565b50915091508184604001511461141a5760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561145c57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61146983612c8d565b505061148160015f80516020615bba83398151915255565b5050565b5f80516020615b7a8339815191525f806114aa6114a185611f76565b604001516130ca565b91509150806114d057604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546114ea906151ca565b90505f0361150e5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff1660058111156115345761153461506a565b14611567575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151fc565b5f828152600684016020526040812061157f91614e11565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611617612894565b61162384848434613286565b905061163b60015f80516020615bba83398151915255565b9392505050565b5f8181525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a83398151915293929190829060ff16600381111561168f5761168f61506a565b60038111156116a0576116a061506a565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117195761171961506a565b1415801561173a57506003815160038111156117375761173761506a565b14155b1561175b578051604051633b0d540d60e21b815261063c91906004016155e7565b5f6117698260400151611a76565b905080606001516001600160401b03165f0361179b576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117c8846040015184606001518560800151611f27565b6040518263ffffffff1660e01b81526004016117e4919061520a565b6020604051808303815f875af1158015611800573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611824919061521c565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615b7a8339815191529190611872906151ca565b90505f036118965760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118bc576118bc61506a565b146118ef575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151fc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119289190600401615601565b6020604051808303815f875af1158015611944573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610645919061521c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119b1575080546001600160401b03808416911610155b156119cf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119f983613454565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a4e612894565b611a59823334613465565b9050611a7160015f80516020615bba83398151915255565b919050565b611a7e614e48565b5f8281525f80516020615bda833981519152602052604090819020815160e0810190925280545f80516020615b7a833981519152929190829060ff166005811115611acb57611acb61506a565b6005811115611adc57611adc61506a565b8152602001600182018054611af0906151ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1c906151ca565b8015611b675780601f10611b3e57610100808354040283529160200191611b67565b820191905f5260205f20905b815481529060010190602001808311611b4a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615b7a833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c08908690869061568b565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a8339815191529284929091829060ff166003811115611c6e57611c6e61506a565b6003811115611c7f57611c7f61506a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611cf582611a76565b9050600283516003811115611d0c57611d0c61506a565b14611d2d578251604051633b0d540d60e21b815261063c91906004016155e7565b60208301516001600160a01b03163314611dd0575f828152600585016020526040902054336001600160a01b0390911603611dca575f82815260058501602052604090205460a0820151611d9191600160b01b90046001600160401b03169061569a565b6001600160401b0316421015611dc55760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611dd0565b33611252565b600281516005811115611de557611de561506a565b03611ec2578615611dfc57611dfa828761242e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611e35918491611e3091906156ba565b61373a565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e7684613891565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a31515945061163b9350505050565b600481516005811115611ed757611ed761506a565b03611f0b57611ee583613891565b5f898152600786016020526040902055611efe88612c8d565b600194505050505061163b565b805160405163170cc93360e21b815261063c91906004016151fc565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fda573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261200191908101906156e5565b915091508061202357604051636b2f19e960e01b815260040160405180910390fd5b815115612049578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612085576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f81516026146120c157815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b6002811015612110576120d88160016157b7565b6120e39060086155b1565b61ffff168482815181106120f9576120f96152a7565b016020015160f81c901b91909117906001016120c4565b5061ffff81161561213a5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612195576121518160036157b7565b61215c9060086155b1565b63ffffffff168561216e83600261557c565b8151811061217e5761217e6152a7565b016020015160f81c901b919091179060010161213d565b5063ffffffff8116156121bb57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612210576121d281601f6157b7565b6121dd9060086155b1565b866121e983600661557c565b815181106121f9576121f96152a7565b016020015160f81c901b91909117906001016121be565b50949350505050565b60605f8083356020850135601461223587870160408901615247565b6122426060890189615262565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6122c86060850185615262565b905081101561208557816122df6060860186615262565b838181106122ef576122ef6152a7565b905060200281019061230191906152bb565b61230b90806157ca565b905061231a6060870187615262565b8481811061232a5761232a6152a7565b905060200281019061233c91906152bb565b61234690806157ca565b6123536060890189615262565b86818110612363576123636152a7565b905060200281019061237591906152bb565b6123839060208101906157ca565b61239060608b018b615262565b888181106123a0576123a06152a7565b90506020028101906123b291906152bb565b6123c3906060810190604001614fd5565b6040516020016123d9979695949392919061580c565b60408051601f1981840301815291905291506001016122bb565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612479573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124a091908101906156e5565b91509150806124c257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612505573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612529919061521c565b82511461254f578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b03161561258b576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f8061259a8460400151613a2e565b915091508187146125c15760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615b5a833981519152906001600160401b03908116908316111561267e575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261269d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b5a833981519152816126c186613c1f565b90506126cc866123f3565b6126db5760019250505061163b565b5f8681526005830160205260409020546001600160a01b031633146127005733611252565b5f86815260058301602052604090205460a082015161272f91600160b01b90046001600160401b03169061569a565b6001600160401b03168160c001516001600160401b031610156127765760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f851561278e57612787878661242e565b90506127ac565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127d19061116c565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561283a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061285e919061521c565b905080846008015f8a81526020019081526020015f205f828254612882919061557c565b90915550501515979650505050505050565b5f80516020615bba8339815191528054600119016128c557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128d4614e48565b5f80516020615b7a8339815191525f806128f06114a187611f76565b91509150801561291757604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156129485761294861506a565b60058111156129595761295961506a565b815260200160018201805461296d906151ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612999906151ca565b80156129e45780601f106129bb576101008083540402835291602001916129e4565b820191905f5260205f20905b8154815290600101906020018083116129c757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a4f57612a4f61506a565b14158015612a705750600181516005811115612a6d57612a6d61506a565b14155b15612a9157805160405163170cc93360e21b815261063c91906004016151fc565b600381516005811115612aa657612aa661506a565b03612ab45760048152612ab9565b600581525b836008018160200151604051612acf9190615458565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b1357612b1361506a565b021790555060208201516001820190612b2c90826154ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bd257612bd261506a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c55575f80fd5b505af1158015611030573d5f803e3d5ffd5b6114816001600160a01b03831682613f03565b60015f80516020615bba83398151915255565b5f8181525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a83398151915293929190829060ff166003811115612cda57612cda61506a565b6003811115612ceb57612ceb61506a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e19575f84815260058701602052604090205461271090612dcb90600160a01b900461ffff16856155b1565b612dd591906155c8565b915081866008015f8681526020019081526020015f205f828254612df9919061557c565b90915550612e09905082846157b7565b9050612e19856020015182612c09565b612e2e8560200151610ede876060015161116c565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612eab57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612efa57612ec28160016157b7565b612ecd9060086155b1565b61ffff16868281518110612ee357612ee36152a7565b016020015160f81c901b9190911790600101612eae565b5061ffff811615612f245760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f7f57612f3b8160036157b7565b612f469060086155b1565b63ffffffff1687612f5883600261557c565b81518110612f6857612f686152a7565b016020015160f81c901b9190911790600101612f27565b5063ffffffff8116600314612fa757604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612ffc57612fbe81601f6157b7565b612fc99060086155b1565b88612fd583600661557c565b81518110612fe557612fe56152a7565b016020015160f81c901b9190911790600101612faa565b505f805b600881101561305b576130148160076157b7565b61301f9060086155b1565b6001600160401b03168961303483602661557c565b81518110613044576130446152a7565b016020015160f81c901b9190911790600101613000565b505f805b60088110156130ba576130738160076157b7565b61307e9060086155b1565b6001600160401b03168a61309383602e61557c565b815181106130a3576130a36152a7565b016020015160f81c901b919091179060010161305f565b5091989097509095509350505050565b5f80825160271461310057825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561314f576131178160016157b7565b6131229060086155b1565b61ffff16858281518110613138576131386152a7565b016020015160f81c901b9190911790600101613103565b5061ffff8116156131795760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131d4576131908160036157b7565b61319b9060086155b1565b63ffffffff16866131ad83600261557c565b815181106131bd576131bd6152a7565b016020015160f81c901b919091179060010161317c565b5063ffffffff81166002146131fc57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132515761321381601f6157b7565b61321e9060086155b1565b8761322a83600661557c565b8151811061323a5761323a6152a7565b016020015160f81c901b91909117906001016131ff565b505f86602681518110613266576132666152a7565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b5a83398151915290600160401b900461ffff90811690861610806132da575061271061ffff8616115b156132fe57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b03908116908516101561333a576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b805483108061334c5750806001015483115b1561336d5760405163222d164360e21b81526004810184905260240161063c565b825f61337882610e01565b90505f6133858983613f96565b905060405180608001604052806133993390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61345c61450e565b610efe81614559565b5f5f80516020615b5a8339815191528161347e84610e01565b90505f61348a87611a76565b9050613495876123f3565b6134b5576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156134ca576134ca61506a565b146134eb57805160405163170cc93360e21b815261063c91906004016151fc565b5f8282608001516134fc919061569a565b905083600201600a9054906101000a90046001600160401b031682604001516135259190615875565b6001600160401b0316816001600160401b0316111561356257604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061356e8a8461373a565b915091505f8a8360405160200161359c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561362f5761362f61506a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615bda833981519152602052604081206002015481905f80516020615b7a83398151915290600160801b90046001600160401b031661378285826145cd565b5f61378c876147f0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137dc8a858b611f27565b6040518263ffffffff1660e01b81526004016137f8919061520a565b6020604051808303815f875af1158015613814573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613838919061521c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b5a83398151915290505f6138b18460400151611a76565b90505f6003825160058111156138c9576138c961506a565b14806138e757506004825160058111156138e5576138e561506a565b145b156138f7575060c0810151613934565b60028251600581111561390c5761390c61506a565b03613918575042613934565b815160405163170cc93360e21b815261063c91906004016151fc565b84608001516001600160401b0316816001600160401b03161161395b57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139809061116c565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a25919061521c565b95945050505050565b5f808251602e14613a6457825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613ab357613a7b8160016157b7565b613a869060086155b1565b61ffff16858281518110613a9c57613a9c6152a7565b016020015160f81c901b9190911790600101613a67565b5061ffff811615613add5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b3857613af48160036157b7565b613aff9060086155b1565b63ffffffff1686613b1183600261557c565b81518110613b2157613b216152a7565b016020015160f81c901b9190911790600101613ae0565b5063ffffffff811615613b5e57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bb357613b7581601f6157b7565b613b809060086155b1565b87613b8c83600661557c565b81518110613b9c57613b9c6152a7565b016020015160f81c901b9190911790600101613b61565b505f805b6008811015613c1257613bcb8160076157b7565b613bd69060086155b1565b6001600160401b031688613beb83602661557c565b81518110613bfb57613bfb6152a7565b016020015160f81c901b9190911790600101613bb7565b5090969095509350505050565b613c27614e48565b5f8281525f80516020615bda8339815191526020526040808220815160e0810190925280545f80516020615b7a83398151915293929190829060ff166005811115613c7457613c7461506a565b6005811115613c8557613c8561506a565b8152602001600182018054613c99906151ca565b80601f0160208091040260200160405190810160405280929190818152602001828054613cc5906151ca565b8015613d105780601f10613ce757610100808354040283529160200191613d10565b820191905f5260205f20905b815481529060010190602001808311613cf357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d7e57613d7e61506a565b14613db1575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151fc565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613df557613df561506a565b021790555060208201516001820190613e0e90826154ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613eac858261373a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f265760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f6f576040519150601f19603f3d011682016040523d82523d5f602084013e613f74565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fda57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615b7a83398151915242613ff96060860160408701614fd5565b6001600160401b031611158061403357506140176202a3004261557c565b6140276060860160408701614fd5565b6001600160401b031610155b1561406d576140486060850160408601614fd5565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61408261407d60608601866158a0565b614865565b61409261407d60808601866158a0565b60306140a160208601866157ca565b9050146140d3576140b560208501856157ca565b6040516326475b2f60e11b815261063c925060040190815260200190565b6140dd84806157ca565b90505f0361410a576140ef84806157ca565b604051633e08a12560e11b815260040161063c9291906158b4565b5f6008820161411986806157ca565b60405161412792919061568b565b908152602001604051809103902054146141605761414584806157ca565b60405163a41f772f60e01b815260040161063c9291906158b4565b61416a835f6145cd565b6040805160e08101909152815481525f908190614276906020810161418f89806157ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141d7908a018a6157ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161422060608a0160408b01614fd5565b6001600160401b0316815260200161423b60608a018a6158a0565b614244906158e2565b815260200161425660808a018a6158a0565b61425f906158e2565b8152602001876001600160401b03168152506149ce565b5f8281526006860160205260409020919350915061429482826154ad565b5081600884016142a488806157ca565b6040516142b292919061568b565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142ee90859060040161520a565b6020604051808303815f875af115801561430a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061432e919061521c565b6040805160e08101909152909150806001815260200161434e89806157ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143dd576143dd61506a565b0217905550602082015160018201906143f690826154ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061449488806157ca565b6040516144a292919061568b565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144e09190614fd5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661455757604051631afcd79f60e31b815260040160405180910390fd5b565b61456161450e565b61456a81614bbb565b614572614bd4565b610efe6060820135608083013561458f60c0850160a08601614fd5565b61459f60e0860160c087016159a9565b6145b0610100870160e088016159c2565b6101008701356145c861014089016101208a01615247565b614be4565b5f80516020615b7a8339815191525f6001600160401b038084169085161115614601576145fa83856156ba565b905061460e565b61460b84846156ba565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061467057506001840154815161466c916001600160401b03169061557c565b8210155b15614696576001600160401b0383166060820152818152604081015160208201526146b5565b82816060018181516146a8919061569a565b6001600160401b03169052505b60608101516146c5906064615875565b602082015160018601546001600160401b0392909216916146f09190600160401b900460ff166155b1565b101561472057606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161473b919061557c565b9052506040810180516001600160401b038716919061475b9083906157b7565b9052506001840154604082015160649161478091600160401b90910460ff16906155b1565b10156147a7578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bda8339815191526020526040812060020180545f80516020615b7a833981519152919060089061483a90600160401b90046001600160401b03166159e2565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148726020820182614f7e565b63ffffffff16158015614892575061488d6020820182615262565b151590505b156148d9576148a46020820182614f7e565b6148b16020830183615262565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6148e66020820182615262565b90506148f56020830183614f7e565b63ffffffff16111561490e576148a46020820182614f7e565b60015b61491e6020830183615262565b9050811015611481576149346020830183615262565b61493f6001846157b7565b81811061494e5761494e6152a7565b90506020020160208101906149639190615247565b6001600160a01b03166149796020840184615262565b83818110614989576149896152a7565b905060200201602081019061499e9190615247565b6001600160a01b031610156149c657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614911565b5f60608260400151516030146149f75760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a38988a9860019892979296909590949093909291016159fd565b60405160208183030381529060405290505f5b84608001516020015151811015614aaa57818560800151602001518281518110614a7757614a776152a7565b6020026020010151604051602001614a90929190615ab7565b60408051601f198184030181529190529150600101614a4b565b5060a0840151805160209182015151604051614aca938593929101615aed565b60405160208183030381529060405290505f5b8460a001516020015151811015614b3c57818560a00151602001518281518110614b0957614b096152a7565b6020026020010151604051602001614b22929190615ab7565b60408051601f198184030181529190529150600101614add565b5060c0840151604051614b53918391602001615b28565b6040516020818303038152906040529050600281604051614b749190615458565b602060405180830381855afa158015614b8f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bb2919061521c565b94909350915050565b614bc361450e565b614bcb614d19565b610efe81614d21565b614bdc61450e565b614557614e09565b614bec61450e565b5f80516020615b5a83398151915261ffff85161580614c10575061271061ffff8616115b15614c3457604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614c585760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614c6b5750600a60ff8516115b15614c8e5760405163170db35960e31b815260ff8516600482015260240161063c565b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61455761450e565b614d2961450e565b80355f80516020615b7a8339815191529081556014614d4e60608401604085016159c2565b60ff161180614d6d5750614d6860608301604084016159c2565b60ff16155b15614da157614d8260608301604084016159c2565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614db160608301604084016159c2565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614de26040830160208401614fd5565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c7a61450e565b508054614e1d906151ca565b5f825580601f10614e2c575050565b601f0160209004905f5260205f2090810190610efe9190614e85565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e99575f8155600101614e86565b5090565b8015158114610efe575f80fd5b803563ffffffff81168114611a71575f80fd5b5f805f60608486031215614ecf575f80fd5b833592506020840135614ee181614e9d565b9150614eef60408501614eaa565b90509250925092565b5f60208284031215614f08575f80fd5b5035919050565b5f8060408385031215614f20575f80fd5b82356001600160401b03811115614f35575f80fd5b830160808186031215614f46575f80fd5b9150614f5460208401614eaa565b90509250929050565b5f8060408385031215614f6e575f80fd5b82359150614f5460208401614eaa565b5f60208284031215614f8e575f80fd5b61163b82614eaa565b5f8060408385031215614fa8575f80fd5b614fb183614eaa565b946020939093013593505050565b80356001600160401b0381168114611a71575f80fd5b5f60208284031215614fe5575f80fd5b61163b82614fbf565b803561ffff81168114611a71575f80fd5b5f805f60608486031215615011575f80fd5b83356001600160401b03811115615026575f80fd5b840160a08187031215615037575f80fd5b925061504560208501614fee565b9150614eef60408501614fbf565b5f6101408284031215615064575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061508e5761508e61506a565b9052565b5f5b838110156150ac578181015183820152602001615094565b50505f910152565b5f81518084526150cb816020860160208601615092565b601f01601f19169290920160200192915050565b602081526150f160208201835161507e565b5f602083015160e0604084015261510c6101008401826150b4565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615170575f80fd5b82356001600160401b0380821115615186575f80fd5b818501915085601f830112615199575f80fd5b8135818111156151a7575f80fd5b8660208285010111156151b8575f80fd5b60209290920196919550909350505050565b600181811c908216806151de57607f821691505b60208210810361506457634e487b7160e01b5f52602260045260245ffd5b60208101610e2f828461507e565b602081525f61163b60208301846150b4565b5f6020828403121561522c575f80fd5b5051919050565b6001600160a01b0381168114610efe575f80fd5b5f60208284031215615257575f80fd5b813561163b81615233565b5f808335601e19843603018112615277575f80fd5b8301803591506001600160401b03821115615290575f80fd5b6020019150600581901b360382131561388a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152cf575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561530f5761530f6152d9565b60405290565b604080519081016001600160401b038111828210171561530f5761530f6152d9565b604051601f8201601f191681016001600160401b038111828210171561535f5761535f6152d9565b604052919050565b5f6001600160401b0382111561537f5761537f6152d9565b50601f01601f191660200190565b5f82601f83011261539c575f80fd5b81356153af6153aa82615367565b615337565b8181528460208386010111156153c3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153ef575f80fd5b6153f76152ed565b82356001600160401b038082111561540d575f80fd5b6154193683870161538d565b8352602085013591508082111561542e575f80fd5b5061543b3682860161538d565b60208301525061544d60408401614fbf565b604082015292915050565b5f82516152cf818460208701615092565b601f82111561064557805f5260205f20601f840160051c8101602085101561548e5750805b601f840160051c820191505b81811015611824575f815560010161549a565b81516001600160401b038111156154c6576154c66152d9565b6154da816154d484546151ca565b84615469565b602080601f83116001811461550d575f84156154f65750858301515b5f19600386901b1c1916600185901b178555611030565b5f85815260208120601f198616915b8281101561553b5788860151825594840194600190910190840161551c565b508582101561555857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e2f57610e2f615568565b5f63ffffffff8083168181036155a7576155a7615568565b6001019392505050565b8082028115828204841417610e2f57610e2f615568565b5f826155e257634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155fb576155fb61506a565b91905290565b5f60208083525f8454615613816151ca565b806020870152604060018084165f811461563457600181146156505761567d565b60ff19851660408a0152604084151560051b8a0101955061567d565b895f5260205f205f5b858110156156745781548b8201860152908301908801615659565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561208557612085615568565b6001600160401b0382811682821603908082111561208557612085615568565b8051611a7181614e9d565b5f80604083850312156156f6575f80fd5b82516001600160401b038082111561570c575f80fd5b908401906060828703121561571f575f80fd5b6157276152ed565b8251815260208084015161573a81615233565b8282015260408401518381111561574f575f80fd5b80850194505087601f850112615763575f80fd5b835192506157736153aa84615367565b8381528882858701011115615786575f80fd5b61579584838301848801615092565b806040840152508195506157aa8188016156da565b9450505050509250929050565b81810381811115610e2f57610e2f615568565b5f808335601e198436030181126157df575f80fd5b8301803591506001600160401b038211156157f8575f80fd5b60200191503681900382131561388a575f80fd5b5f885161581d818460208d01615092565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461589857615898615568565b505092915050565b5f8235603e198336030181126152cf575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156158f2575f80fd5b6158fa615315565b61590383614eaa565b81526020808401356001600160401b038082111561591f575f80fd5b9085019036601f830112615931575f80fd5b813581811115615943576159436152d9565b8060051b9150615954848301615337565b818152918301840191848101903684111561596d575f80fd5b938501935b83851015615997578435925061598783615233565b8282529385019390850190615972565b94860194909452509295945050505050565b5f602082840312156159b9575f80fd5b61163b82614fee565b5f602082840312156159d2575f80fd5b813560ff8116811461163b575f80fd5b5f6001600160401b038083168181036155a7576155a7615568565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a4381602a850160208b01615092565b865190830190615a5a81602a840160208b01615092565b60c087901b6001600160c01b031916602a9290910191820152615a8c603282018660e01b6001600160e01b0319169052565b615aa5603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ac8818460208801615092565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615afe818460208901615092565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b39818460208801615092565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -728,7 +729,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Regist // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // -// Solidity: function valueToWeight(uint256 value) pure returns(uint64) +// Solidity: function valueToWeight(uint256 value) view returns(uint64) func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ValueToWeight(opts *bind.CallOpts, value *big.Int) (uint64, error) { var out []interface{} err := _NativeTokenStakingManager.contract.Call(opts, &out, "valueToWeight", value) @@ -745,21 +746,21 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ValueToWeight // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // -// Solidity: function valueToWeight(uint256 value) pure returns(uint64) +// Solidity: function valueToWeight(uint256 value) view returns(uint64) func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ValueToWeight(value *big.Int) (uint64, error) { return _NativeTokenStakingManager.Contract.ValueToWeight(&_NativeTokenStakingManager.CallOpts, value) } // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // -// Solidity: function valueToWeight(uint256 value) pure returns(uint64) +// Solidity: function valueToWeight(uint256 value) view returns(uint64) func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ValueToWeight(value *big.Int) (uint64, error) { return _NativeTokenStakingManager.Contract.ValueToWeight(&_NativeTokenStakingManager.CallOpts, value) } // WeightToValue is a free data retrieval call binding the contract method 0x62065856. // -// Solidity: function weightToValue(uint64 weight) pure returns(uint256) +// Solidity: function weightToValue(uint64 weight) view returns(uint256) func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) WeightToValue(opts *bind.CallOpts, weight uint64) (*big.Int, error) { var out []interface{} err := _NativeTokenStakingManager.contract.Call(opts, &out, "weightToValue", weight) @@ -776,14 +777,14 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) WeightToValue // WeightToValue is a free data retrieval call binding the contract method 0x62065856. // -// Solidity: function weightToValue(uint64 weight) pure returns(uint256) +// Solidity: function weightToValue(uint64 weight) view returns(uint256) func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) WeightToValue(weight uint64) (*big.Int, error) { return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } // WeightToValue is a free data retrieval call binding the contract method 0x62065856. // -// Solidity: function weightToValue(uint64 weight) pure returns(uint256) +// Solidity: function weightToValue(uint64 weight) view returns(uint256) func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WeightToValue(weight uint64) (*big.Int, error) { return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } @@ -935,23 +936,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Fo return _NativeTokenStakingManager.Contract.ForceInitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x20e55565. +// Initialize is a paid mutator transaction binding the contract method 0xc257a0f5. // -// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,uint256,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.contract.Transact(opts, "initialize", settings) } -// Initialize is a paid mutator transaction binding the contract method 0x20e55565. +// Initialize is a paid mutator transaction binding the contract method 0xc257a0f5. // -// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,uint256,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } -// Initialize is a paid mutator transaction binding the contract method 0x20e55565. +// Initialize is a paid mutator transaction binding the contract method 0xc257a0f5. // -// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,uint256,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index d8dc49ced..7bb941538 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -53,6 +53,8 @@ abstract contract PoSValidatorManager is * the maximum stake would be equal to the initial stake. */ uint64 _maximumStakeMultiplier; + /// @notice The factor used to convert between weight and value. + uint256 _weightToValueFactor; /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; /// @notice Maps the validation ID to its requirements. @@ -115,6 +117,7 @@ abstract contract PoSValidatorManager is minimumStakeDuration: settings.minimumStakeDuration, minimumDelegationFeeBips: settings.minimumDelegationFeeBips, maximumStakeMultiplier: settings.maximumStakeMultiplier, + weightToValueFactor: settings.weightToValueFactor, rewardCalculator: settings.rewardCalculator }); } @@ -126,6 +129,7 @@ abstract contract PoSValidatorManager is uint64 minimumStakeDuration, uint16 minimumDelegationFeeBips, uint8 maximumStakeMultiplier, + uint256 weightToValueFactor, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -146,6 +150,7 @@ abstract contract PoSValidatorManager is $._minimumStakeDuration = minimumStakeDuration; $._minimumDelegationFeeBips = minimumDelegationFeeBips; $._maximumStakeMultiplier = maximumStakeMultiplier; + $._weightToValueFactor = weightToValueFactor; $._rewardCalculator = rewardCalculator; } @@ -365,16 +370,16 @@ abstract contract PoSValidatorManager is * @notice Converts a token value to a weight. * @param value Token value to convert. */ - function valueToWeight(uint256 value) public pure returns (uint64) { - return uint64(value / 1e12); + function valueToWeight(uint256 value) public view returns (uint64) { + return uint64(value / _getPoSValidatorManagerStorage()._weightToValueFactor); } /** * @notice Converts a weight to a token value. * @param weight weight to convert. */ - function weightToValue(uint64 weight) public pure returns (uint256) { - return uint256(weight) * 1e12; + function weightToValue(uint64 weight) public view returns (uint256) { + return uint256(weight) * _getPoSValidatorManagerStorage()._weightToValueFactor; } /** diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index b3274940f..fc0a77d6c 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -28,6 +28,7 @@ struct PoSValidatorManagerSettings { uint64 minimumStakeDuration; uint16 minimumDelegationFeeBips; uint8 maximumStakeMultiplier; + uint256 weightToValueFactor; IRewardCalculator rewardCalculator; } diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index 986a23f93..d34b7cc9e 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -55,6 +55,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: 0, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }), token @@ -81,6 +82,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: minimumDelegationFeeBips, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }), token @@ -106,6 +108,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }), token @@ -129,6 +132,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: 0, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }), token @@ -155,6 +159,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: maximumStakeMultiplier, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }), token @@ -258,6 +263,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: rewardCalculator }), token diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index b8a7faa10..568521c70 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -50,6 +50,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: 0, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }) ); @@ -75,6 +76,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: minimumDelegationFeeBips, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }) ); @@ -99,6 +101,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }) ); @@ -121,6 +124,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: 0, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }) ); @@ -146,6 +150,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: maximumStakeMultiplier, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }) ); @@ -227,6 +232,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: rewardCalculator }) ); diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 00ae5643f..f6adbb09b 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -34,6 +34,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; uint16 public constant DEFAULT_DELEGATION_FEE_BIPS = 150; uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; + uint256 public constant DEFAULT_WEIGHT_TO_VALUE_FACTOR = 1e12; uint256 public constant SECONDS_IN_YEAR = 31536000; PoSValidatorManager public posValidatorManager; diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 9cce8b401..1d7a04d72 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -222,6 +222,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { MinimumStakeDuration: utils.DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: utils.DefaultMinDelegateFeeBips, MaximumStakeMultiplier: utils.DefaultMaxStakeMultiplier, + WeightToValueFactor: big.NewInt(0).SetUint64(utils.DefaultWeightToValueFactor), RewardCalculator: rewardCalculatorAddress, }, ) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index b856d8aa8..b3626bc14 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -51,6 +51,7 @@ const ( DefaultMaxStakeMultiplier uint8 = 4 DefaultMaxChurnPercentage uint8 = 20 DefaultChurnPeriodSeconds uint64 = 1 + DefaultWeightToValueFactor uint64 = 1e12 DefaultPChainAddress string = "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" ) @@ -110,6 +111,7 @@ func DeployAndInitializeNativeTokenStakingManager( MinimumStakeDuration: DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, MaximumStakeMultiplier: DefaultMaxStakeMultiplier, + WeightToValueFactor: big.NewInt(0).SetUint64(DefaultWeightToValueFactor), RewardCalculator: rewardCalculatorAddress, }, ) @@ -178,6 +180,7 @@ func DeployAndInitializeERC20TokenStakingManager( MinimumStakeDuration: DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, MaximumStakeMultiplier: DefaultMaxStakeMultiplier, + WeightToValueFactor: big.NewInt(0).SetUint64(DefaultWeightToValueFactor), RewardCalculator: rewardCalculatorAddress, }, erc20Address, From cdb3cca681865a18f7a2b2d2077865adc59f9df7 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 21 Oct 2024 13:06:30 -0500 Subject: [PATCH 18/35] disallow zero weight to value factor --- .../validator-manager/PoSValidatorManager.sol | 4 ++++ .../tests/ERC20TokenStakingManagerTests.t.sol | 24 +++++++++++++++++++ .../NativeTokenStakingManagerTests.t.sol | 23 ++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 7bb941538..ddcc8252a 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -91,6 +91,7 @@ abstract contract PoSValidatorManager is error ValidatorNotPoS(bytes32 validationID); error ValidatorIneligibleForRewards(bytes32 validationID); error DelegatorIneligibleForRewards(bytes32 delegationID); + error ZeroWeightToValueFactor(); // solhint-disable ordering function _getPoSValidatorManagerStorage() @@ -144,6 +145,9 @@ abstract contract PoSValidatorManager is { revert InvalidStakeMultiplier(maximumStakeMultiplier); } + if (weightToValueFactor == 0) { + revert ZeroWeightToValueFactor(); + } $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index d34b7cc9e..380b7b8c5 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -166,6 +166,30 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testZeroWeightToValueFactor() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.ZeroWeightToValueFactor.selector) + ); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: 0, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + } + function testInvalidValidatorMinStakeDuration() public { ValidatorRegistrationInput memory input = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index 568521c70..37cdbaa4d 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -156,6 +156,29 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testZeroWeightToValueFactor() public { + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.ZeroWeightToValueFactor.selector) + ); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: 0, + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + // Helpers function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, From 73629bb3c8e8eeb720dd361eb563004024547d0c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 21 Oct 2024 14:02:51 -0500 Subject: [PATCH 19/35] revert if weight=0 --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 4 ++-- .../NativeTokenStakingManager.go | 4 ++-- contracts/validator-manager/PoSValidatorManager.sol | 6 +++++- .../tests/PoSValidatorManagerTests.t.sol | 8 ++++++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 7869e692c..e2808e323 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -91,8 +91,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161604838038061604883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615efb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615119565b6104b3565b005b610214610224366004615154565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615119565b6106f6565b61021461026936600461516b565b610701565b61021461027c3660046151b9565b610c2b565b61029461028f366004615154565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615119565b610cd3565b6102146102e93660046151da565b610cde565b6103016102fc36600461521a565b610d9f565b60405190815260200161023f565b61021461031d36600461527f565b610dd4565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d3660046152a7565b61103f565b610294610360366004615154565b611076565b6103015f81565b61021461037a366004615119565b61108a565b610231603081565b610214610395366004615154565b6110b5565b6102146103a836600461527f565b611180565b6103016103bb3660046152c0565b611358565b6102146103ce3660046151da565b611384565b6103015f80516020615e4f83398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b366004615154565b61150d565b6103015f80516020615e6f83398151915281565b610214610442366004615154565b6116f6565b610231601481565b61046261045d366004615154565b611833565b60405161023f9190615355565b6102946202a30081565b6103015f80516020615e2f83398151915281565b61021461049b3660046153e9565b611982565b6103016104ae366004615427565b611a61565b6104be838383611abc565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615ecf8339815191526020526040808220815160e0810190925280545f80516020615e6f83398151915293929190829060ff166005811115610535576105356152e0565b6005811115610546576105466152e0565b815260200160018201805461055a90615492565b80601f016020809104026020016040519081016040528092919081815260200182805461058690615492565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c6152e0565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016154ca565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611dca565b6040518263ffffffff1660e01b81526004016106b091906154d8565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906154ea565b50505050565b6106f0838383611abc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615e6f8339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906154ea565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615501565b6001600160a01b031614610837576108126060840160408501615501565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f610845606085018561551c565b905090505f805b828163ffffffff161015610b2d575f610868606088018861551c565b8363ffffffff1681811061087e5761087e615561565b90506020028101906108909190615575565b61089990615699565b80516040519192505f9160088801916108b191615712565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da91906004016154d8565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615712565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906154ea565b90508086600801835f01516040516109809190615712565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a026152e0565b021790555060208201516001820190610a1b9082615767565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac0911685615836565b8251604051919550610ad191615712565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615849565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff168361586b565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e19565b60400151611f2f565b90505f610b95876120bc565b90505f600282604051610ba89190615712565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906154ea565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612296565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611833565b5190506002816005811115610c7557610c756152e0565b14610c95578060405163170cc93360e21b81526004016104da91906154ca565b6106f083836122d1565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610ccd9083615882565b92915050565b6106f083838361254b565b610ce6612737565b5f80516020615e4f8339815191525f80610cff8461276e565b91509150610d0c82612296565b610d1857505050610d86565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d4657610d466152e0565b03610d6b575f83815260088501602052604081208054919055610d698282612aac565b505b610d8181610d7c846040015161103f565b612b22565b505050505b610d9c60015f80516020615eaf83398151915255565b50565b5f610da8612737565b610db485858585612b58565b9050610dcc60015f80516020615eaf83398151915255565b949350505050565b5f8181525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f83398151915293929190829060ff166003811115610e2157610e216152e0565b6003811115610e3257610e326152e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ea882611833565b9050600183516003811115610ebf57610ebf6152e0565b14610ee0578251604051633b0d540d60e21b81526104da91906004016158a1565b600481516005811115610ef557610ef56152e0565b03610f0b57610f0385612d31565b505050505050565b5f80610f22610f1989611e19565b60400151612f18565b5091509150818414610f4f57846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610f885750806001600160401b03168560a001516001600160401b0316115b15610fb157604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610ccd906001600160401b03841661586b565b5f61108082611833565b6080015192915050565b61109583838361254b565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615e4f8339815191525f6110cd83611833565b51905060048160058111156110e4576110e46152e0565b14611104578060405163170cc93360e21b81526004016104da91906154ca565b5f8381526005830160205260409020546001600160a01b0316331461114a57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612aac565b611188612737565b5f8181525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f83398151915293929190829060ff1660038111156111d5576111d56152e0565b60038111156111e6576111e66152e0565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561125f5761125f6152e0565b14611280578051604051633b0d540d60e21b81526104da91906004016158a1565b600461128f8260400151611833565b5160058111156112a1576112a16152e0565b14611333575f6112b085611e19565b90505f806112c18360400151612f18565b5091509150818460400151146112ed5760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561132f57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61133c83612d31565b505061135460015f80516020615eaf83398151915255565b5050565b5f611361612737565b61136c83338461316e565b9050610ccd60015f80516020615eaf83398151915255565b5f80516020615e6f8339815191525f806113a96113a085611e19565b60400151613446565b91509150806113cf57604051632d07135360e01b815281151560048201526024016104da565b5f828152600684016020526040902080546113e990615492565b90505f0361140d5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff166005811115611433576114336152e0565b14611466575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff16906004016154ca565b5f828152600684016020526040812061147e91615068565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f83398151915293929190829060ff16600381111561155a5761155a6152e0565b600381111561156b5761156b6152e0565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115e4576115e46152e0565b141580156116055750600381516003811115611602576116026152e0565b14155b15611626578051604051633b0d540d60e21b81526104da91906004016158a1565b5f6116348260400151611833565b905080606001516001600160401b03165f03611666576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb611693846040015184606001518560800151611dca565b6040518263ffffffff1660e01b81526004016116af91906154d8565b6020604051808303815f875af11580156116cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ef91906154ea565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615e6f833981519152919061173d90615492565b90505f036117615760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff166005811115611787576117876152e0565b146117ba575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff16906004016154ca565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117f391906004016158bb565b6020604051808303815f875af115801561180f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906154ea565b61183b61509f565b5f8281525f80516020615ecf833981519152602052604090819020815160e0810190925280545f80516020615e6f833981519152929190829060ff166005811115611888576118886152e0565b6005811115611899576118996152e0565b81526020016001820180546118ad90615492565b80601f01602080910402602001604051908101604052809291908181526020018280546118d990615492565b80156119245780601f106118fb57610100808354040283529160200191611924565b820191905f5260205f20905b81548152906001019060200180831161190757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119cb575080546001600160401b03808416911610155b156119e95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a148484613602565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615e6f833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aa49086908690615945565b90815260200160405180910390205491505092915050565b5f8381525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f8339815191529284929091829060ff166003811115611b0a57611b0a6152e0565b6003811115611b1b57611b1b6152e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b9182611833565b9050600283516003811115611ba857611ba86152e0565b14611bc9578251604051633b0d540d60e21b81526104da91906004016158a1565b60208301516001600160a01b03163314611c6c575f828152600585016020526040902054336001600160a01b0390911603611c66575f82815260058501602052604090205460a0820151611c2d91600160b01b90046001600160401b031690615954565b6001600160401b0316421015611c615760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611c6c565b33611125565b600281516005811115611c8157611c816152e0565b03611d5e578615611c9857611c9682876122d1565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611cd1918491611ccc9190615974565b61361c565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d1284613773565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611dc39350505050565b600481516005811115611d7357611d736152e0565b03611da757611d8183613773565b5f898152600786016020526040902055611d9a88612d31565b6001945050505050611dc3565b805160405163170cc93360e21b81526104da91906004016154ca565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e7d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ea4919081019061599f565b9150915080611ec657604051636b2f19e960e01b815260040160405180910390fd5b815115611eec578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f28576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611f6457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b6002811015611fb357611f7b816001615a71565b611f8690600861586b565b61ffff16848281518110611f9c57611f9c615561565b016020015160f81c901b9190911790600101611f67565b5061ffff811615611fdd5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561203857611ff4816003615a71565b611fff90600861586b565b63ffffffff1685612011836002615836565b8151811061202157612021615561565b016020015160f81c901b9190911790600101611fe0565b5063ffffffff81161561205e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120b35761207581601f615a71565b61208090600861586b565b8661208c836006615836565b8151811061209c5761209c615561565b016020015160f81c901b9190911790600101612061565b50949350505050565b60605f808335602085013560146120d887870160408901615501565b6120e5606089018961551c565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61216b606085018561551c565b9050811015611f285781612182606086018661551c565b8381811061219257612192615561565b90506020028101906121a49190615575565b6121ae9080615a84565b90506121bd606087018761551c565b848181106121cd576121cd615561565b90506020028101906121df9190615575565b6121e99080615a84565b6121f6606089018961551c565b8681811061220657612206615561565b90506020028101906122189190615575565b612226906020810190615a84565b61223360608b018b61551c565b8881811061224357612243615561565b90506020028101906122559190615575565b6122669060608101906040016152a7565b60405160200161227c9796959493929190615ac6565b60408051601f19818403018152919052915060010161215e565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561231c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612343919081019061599f565b915091508061236557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123cc91906154ea565b8251146123f2578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561242e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061243d8460400151613910565b915091508187146124645760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615e4f833981519152906001600160401b039081169083161115612521575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612540565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e4f8339815191528161256486613b01565b905061256f86612296565b61257e57600192505050611dc3565b5f8681526005830160205260409020546001600160a01b031633146125a35733611125565b5f86815260058301602052604090205460a08201516125d291600160b01b90046001600160401b031690615954565b6001600160401b03168160c001516001600160401b031610156126195760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126315761262a87866122d1565b905061264f565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126749061103f565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156126dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061270191906154ea565b905080846008015f8a81526020019081526020015f205f8282546127259190615836565b90915550501515979650505050505050565b5f80516020615eaf83398151915280546001190161276857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61277761509f565b5f80516020615e6f8339815191525f806127936113a087611e19565b9150915080156127ba57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127eb576127eb6152e0565b60058111156127fc576127fc6152e0565b815260200160018201805461281090615492565b80601f016020809104026020016040519081016040528092919081815260200182805461283c90615492565b80156128875780601f1061285e57610100808354040283529160200191612887565b820191905f5260205f20905b81548152906001019060200180831161286a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128f2576128f26152e0565b141580156129135750600181516005811115612910576129106152e0565b14155b1561293457805160405163170cc93360e21b81526104da91906004016154ca565b600381516005811115612949576129496152e0565b03612957576004815261295c565b600581525b8360080181602001516040516129729190615712565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156129b6576129b66152e0565b0217905550602082015160018201906129cf9082615767565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a7557612a756152e0565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e2f83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b07575f80fd5b505af1158015612b19573d5f803e3d5ffd5b50505050505050565b5f80516020615e2f83398151915254611354906001600160a01b03168383613de5565b60015f80516020615eaf83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e4f83398151915290600160401b900461ffff9081169086161080612bac575061271061ffff8616115b15612bd057604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c0c576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c1e5750806001015483115b15612c3f5760405163222d164360e21b8152600481018490526024016104da565b5f612c4984613e44565b90505f612c5582610c9f565b90505f612c628983613e67565b90506040518060800160405280612c763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615e8f8339815191526020526040808220815160e0810190925280545f80516020615e4f83398151915293929190829060ff166003811115612d7e57612d7e6152e0565b6003811115612d8f57612d8f6152e0565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612ebd575f84815260058701602052604090205461271090612e6f90600160a01b900461ffff168561586b565b612e799190615882565b915081866008015f8681526020019081526020015f205f828254612e9d9190615836565b90915550612ead90508284615a71565b9050612ebd856020015182612aac565b612ed28560200151610d7c876060015161103f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f4f57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612f9e57612f66816001615a71565b612f7190600861586b565b61ffff16868281518110612f8757612f87615561565b016020015160f81c901b9190911790600101612f52565b5061ffff811615612fc85760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561302357612fdf816003615a71565b612fea90600861586b565b63ffffffff1687612ffc836002615836565b8151811061300c5761300c615561565b016020015160f81c901b9190911790600101612fcb565b5063ffffffff811660031461304b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130a05761306281601f615a71565b61306d90600861586b565b88613079836006615836565b8151811061308957613089615561565b016020015160f81c901b919091179060010161304e565b505f805b60088110156130ff576130b8816007615a71565b6130c390600861586b565b6001600160401b0316896130d8836026615836565b815181106130e8576130e8615561565b016020015160f81c901b91909117906001016130a4565b505f805b600881101561315e57613117816007615a71565b61312290600861586b565b6001600160401b03168a61313783602e615836565b8151811061314757613147615561565b016020015160f81c901b9190911790600101613103565b5091989097509095509350505050565b5f5f80516020615e4f8339815191528161318a61028f85613e44565b90505f61319687611833565b90506131a187612296565b6131c1576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156131d6576131d66152e0565b146131f757805160405163170cc93360e21b81526104da91906004016154ca565b5f8282608001516132089190615954565b905083600201600a9054906101000a90046001600160401b031682604001516132319190615b2f565b6001600160401b0316816001600160401b0316111561326e57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f8061327a8a8461361c565b915091505f8a836040516020016132a892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561333b5761333b6152e0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461347c57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156134cb57613493816001615a71565b61349e90600861586b565b61ffff168582815181106134b4576134b4615561565b016020015160f81c901b919091179060010161347f565b5061ffff8116156134f55760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156135505761350c816003615a71565b61351790600861586b565b63ffffffff1686613529836002615836565b8151811061353957613539615561565b016020015160f81c901b91909117906001016134f8565b5063ffffffff811660021461357857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135cd5761358f81601f615a71565b61359a90600861586b565b876135a6836006615836565b815181106135b6576135b6615561565b016020015160f81c901b919091179060010161357b565b505f866026815181106135e2576135e2615561565b016020015191976001600160f81b03199092161515965090945050505050565b61360a6143df565b6136138261442a565b6113548161449e565b5f8281525f80516020615ecf833981519152602052604081206002015481905f80516020615e6f83398151915290600160801b90046001600160401b03166136648582614506565b5f61366e87614729565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136be8a858b611dca565b6040518263ffffffff1660e01b81526004016136da91906154d8565b6020604051808303815f875af11580156136f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371a91906154ea565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e4f83398151915290505f6137938460400151611833565b90505f6003825160058111156137ab576137ab6152e0565b14806137c957506004825160058111156137c7576137c76152e0565b145b156137d9575060c0810151613816565b6002825160058111156137ee576137ee6152e0565b036137fa575042613816565b815160405163170cc93360e21b81526104da91906004016154ca565b84608001516001600160401b0316816001600160401b03161161383d57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138629061103f565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156138e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390791906154ea565b95945050505050565b5f808251602e1461394657825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b60028110156139955761395d816001615a71565b61396890600861586b565b61ffff1685828151811061397e5761397e615561565b016020015160f81c901b9190911790600101613949565b5061ffff8116156139bf5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a1a576139d6816003615a71565b6139e190600861586b565b63ffffffff16866139f3836002615836565b81518110613a0357613a03615561565b016020015160f81c901b91909117906001016139c2565b5063ffffffff811615613a4057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a9557613a5781601f615a71565b613a6290600861586b565b87613a6e836006615836565b81518110613a7e57613a7e615561565b016020015160f81c901b9190911790600101613a43565b505f805b6008811015613af457613aad816007615a71565b613ab890600861586b565b6001600160401b031688613acd836026615836565b81518110613add57613add615561565b016020015160f81c901b9190911790600101613a99565b5090969095509350505050565b613b0961509f565b5f8281525f80516020615ecf8339815191526020526040808220815160e0810190925280545f80516020615e6f83398151915293929190829060ff166005811115613b5657613b566152e0565b6005811115613b6757613b676152e0565b8152602001600182018054613b7b90615492565b80601f0160208091040260200160405190810160405280929190818152602001828054613ba790615492565b8015613bf25780601f10613bc957610100808354040283529160200191613bf2565b820191905f5260205f20905b815481529060010190602001808311613bd557829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c6057613c606152e0565b14613c93575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016154ca565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cd757613cd76152e0565b021790555060208201516001820190613cf09082615767565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d8e858261361c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061479e565b5f610ccd825f80516020615e2f833981519152546001600160a01b0316906147ff565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613eab57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615e6f83398151915242613eca60608601604087016152a7565b6001600160401b0316111580613f045750613ee86202a30042615836565b613ef860608601604087016152a7565b6001600160401b031610155b15613f3e57613f1960608501604086016152a7565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f53613f4e6060860186615b5a565b614958565b613f63613f4e6080860186615b5a565b6030613f726020860186615a84565b905014613fa457613f866020850185615a84565b6040516326475b2f60e11b81526104da925060040190815260200190565b613fae8480615a84565b90505f03613fdb57613fc08480615a84565b604051633e08a12560e11b81526004016104da929190615b6e565b5f60088201613fea8680615a84565b604051613ff8929190615945565b90815260200160405180910390205414614031576140168480615a84565b60405163a41f772f60e01b81526004016104da929190615b6e565b61403b835f614506565b6040805160e08101909152815481525f90819061414790602081016140608980615a84565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906140a8908a018a615a84565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140f160608a0160408b016152a7565b6001600160401b0316815260200161410c60608a018a615b5a565b61411590615b9c565b815260200161412760808a018a615b5a565b61413090615b9c565b8152602001876001600160401b0316815250614ac1565b5f828152600686016020526040902091935091506141658282615767565b5081600884016141758880615a84565b604051614183929190615945565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141bf9085906004016154d8565b6020604051808303815f875af11580156141db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ff91906154ea565b6040805160e08101909152909150806001815260200161421f8980615a84565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156142ae576142ae6152e0565b0217905550602082015160018201906142c79082615767565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143658880615a84565b604051614373929190615945565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906143b191906152a7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661442857604051631afcd79f60e31b815260040160405180910390fd5b565b6144326143df565b61443b81614cae565b614443614cc7565b610d9c6060820135608083013561446060c0850160a086016152a7565b61447060e0860160c08701615c63565b614481610100870160e08801615c7c565b61010087013561449961014089016101208a01615501565b614cd7565b6144a66143df565b5f80516020615e2f8339815191526001600160a01b0382166144e657604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615e6f8339815191525f6001600160401b03808416908516111561453a576145338385615974565b9050614547565b6145448484615974565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145a95750600184015481516145a5916001600160401b031690615836565b8210155b156145cf576001600160401b0383166060820152818152604081015160208201526145ee565b82816060018181516145e19190615954565b6001600160401b03169052505b60608101516145fe906064615b2f565b602082015160018601546001600160401b0392909216916146299190600160401b900460ff1661586b565b101561465957606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146749190615836565b9052506040810180516001600160401b0387169190614694908390615a71565b905250600184015460408201516064916146b991600160401b90910460ff169061586b565b10156146e0578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615ecf8339815191526020526040812060020180545f80516020615e6f833981519152919060089061477390600160401b90046001600160401b0316615c9c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147b26001600160a01b03841683614e0c565b905080515f141580156147d65750808060200190518101906147d49190615cb7565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614845573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061486991906154ea565b90506148806001600160a01b038516333086614e19565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156148c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e891906154ea565b905081811161494e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139078282615a71565b61496560208201826151da565b63ffffffff161580156149855750614980602082018261551c565b151590505b156149cc5761499760208201826151da565b6149a4602083018361551c565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b6149d9602082018261551c565b90506149e860208301836151da565b63ffffffff161115614a015761499760208201826151da565b60015b614a11602083018361551c565b905081101561135457614a27602083018361551c565b614a32600184615a71565b818110614a4157614a41615561565b9050602002016020810190614a569190615501565b6001600160a01b0316614a6c602084018461551c565b83818110614a7c57614a7c615561565b9050602002016020810190614a919190615501565b6001600160a01b03161015614ab957604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a04565b5f6060826040015151603014614aea5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b2b988a986001989297929690959094909390929101615cd2565b60405160208183030381529060405290505f5b84608001516020015151811015614b9d57818560800151602001518281518110614b6a57614b6a615561565b6020026020010151604051602001614b83929190615d8c565b60408051601f198184030181529190529150600101614b3e565b5060a0840151805160209182015151604051614bbd938593929101615dc2565b60405160208183030381529060405290505f5b8460a001516020015151811015614c2f57818560a00151602001518281518110614bfc57614bfc615561565b6020026020010151604051602001614c15929190615d8c565b60408051601f198184030181529190529150600101614bd0565b5060c0840151604051614c46918391602001615dfd565b6040516020818303038152906040529050600281604051614c679190615712565b602060405180830381855afa158015614c82573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ca591906154ea565b94909350915050565b614cb66143df565b614cbe614e52565b610d9c81614e5a565b614ccf6143df565b614428614f42565b614cdf6143df565b5f80516020615e4f83398151915261ffff85161580614d03575061271061ffff8616115b15614d2757604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614d4b5760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614d5e5750600a60ff8516115b15614d815760405163170db35960e31b815260ff851660048201526024016104da565b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611dc383835f614f4a565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e12565b6144286143df565b614e626143df565b80355f80516020615e6f8339815191529081556014614e876060840160408501615c7c565b60ff161180614ea65750614ea16060830160408401615c7c565b60ff16155b15614eda57614ebb6060830160408401615c7c565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614eea6060830160408401615c7c565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f1b60408301602084016152a7565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b456143df565b606081471015614f6f5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614f8a9190615712565b5f6040518083038185875af1925050503d805f8114614fc4576040519150601f19603f3d011682016040523d82523d5f602084013e614fc9565b606091505b5091509150614fd9868383614fe3565b9695505050505050565b606082614ff857614ff38261503f565b611dc3565b815115801561500f57506001600160a01b0384163b155b1561503857604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611dc3565b80511561504f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461507490615492565b5f825580601f10615083575050565b601f0160209004905f5260205f2090810190610d9c91906150dc565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156150f0575f81556001016150dd565b5090565b8015158114610d9c575f80fd5b803563ffffffff81168114615114575f80fd5b919050565b5f805f6060848603121561512b575f80fd5b83359250602084013561513d816150f4565b915061514b60408501615101565b90509250925092565b5f60208284031215615164575f80fd5b5035919050565b5f806040838503121561517c575f80fd5b82356001600160401b03811115615191575f80fd5b8301608081860312156151a2575f80fd5b91506151b060208401615101565b90509250929050565b5f80604083850312156151ca575f80fd5b823591506151b060208401615101565b5f602082840312156151ea575f80fd5b611dc382615101565b803561ffff81168114615114575f80fd5b80356001600160401b0381168114615114575f80fd5b5f805f806080858703121561522d575f80fd5b84356001600160401b03811115615242575f80fd5b850160a08188031215615253575f80fd5b9350615261602086016151f3565b925061526f60408601615204565b9396929550929360600135925050565b5f8060408385031215615290575f80fd5b61529983615101565b946020939093013593505050565b5f602082840312156152b7575f80fd5b611dc382615204565b5f80604083850312156152d1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b60068110615304576153046152e0565b9052565b5f5b8381101561532257818101518382015260200161530a565b50505f910152565b5f8151808452615341816020860160208601615308565b601f01601f19169290920160200192915050565b602081526153676020820183516152f4565b5f602083015160e0604084015261538261010084018261532a565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d9c575f80fd5b5f808284036101608112156153fc575f80fd5b6101408082121561540b575f80fd5b849350830135905061541c816153d5565b809150509250929050565b5f8060208385031215615438575f80fd5b82356001600160401b038082111561544e575f80fd5b818501915085601f830112615461575f80fd5b81358181111561546f575f80fd5b866020828501011115615480575f80fd5b60209290920196919550909350505050565b600181811c908216806154a657607f821691505b6020821081036154c457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ccd82846152f4565b602081525f611dc3602083018461532a565b5f602082840312156154fa575f80fd5b5051919050565b5f60208284031215615511575f80fd5b8135611dc3816153d5565b5f808335601e19843603018112615531575f80fd5b8301803591506001600160401b0382111561554a575f80fd5b6020019150600581901b360382131561376c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615589575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155c9576155c9615593565b60405290565b604080519081016001600160401b03811182821017156155c9576155c9615593565b604051601f8201601f191681016001600160401b038111828210171561561957615619615593565b604052919050565b5f6001600160401b0382111561563957615639615593565b50601f01601f191660200190565b5f82601f830112615656575f80fd5b813561566961566482615621565b6155f1565b81815284602083860101111561567d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156156a9575f80fd5b6156b16155a7565b82356001600160401b03808211156156c7575f80fd5b6156d336838701615647565b835260208501359150808211156156e8575f80fd5b506156f536828601615647565b60208301525061570760408401615204565b604082015292915050565b5f8251615589818460208701615308565b601f8211156104e357805f5260205f20601f840160051c810160208510156157485750805b601f840160051c820191505b818110156116ef575f8155600101615754565b81516001600160401b0381111561578057615780615593565b6157948161578e8454615492565b84615723565b602080601f8311600181146157c7575f84156157b05750858301515b5f19600386901b1c1916600185901b178555610f03565b5f85815260208120601f198616915b828110156157f5578886015182559484019460019091019084016157d6565b508582101561581257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ccd57610ccd615822565b5f63ffffffff80831681810361586157615861615822565b6001019392505050565b8082028115828204841417610ccd57610ccd615822565b5f8261589c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106158b5576158b56152e0565b91905290565b5f60208083525f84546158cd81615492565b806020870152604060018084165f81146158ee576001811461590a57615937565b60ff19851660408a0152604084151560051b8a01019550615937565b895f5260205f205f5b8581101561592e5781548b8201860152908301908801615913565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f2857611f28615822565b6001600160401b03828116828216039080821115611f2857611f28615822565b8051615114816150f4565b5f80604083850312156159b0575f80fd5b82516001600160401b03808211156159c6575f80fd5b90840190606082870312156159d9575f80fd5b6159e16155a7565b825181526020808401516159f4816153d5565b82820152604084015183811115615a09575f80fd5b80850194505087601f850112615a1d575f80fd5b83519250615a2d61566484615621565b8381528882858701011115615a40575f80fd5b615a4f84838301848801615308565b80604084015250819550615a64818801615994565b9450505050509250929050565b81810381811115610ccd57610ccd615822565b5f808335601e19843603018112615a99575f80fd5b8301803591506001600160401b03821115615ab2575f80fd5b60200191503681900382131561376c575f80fd5b5f8851615ad7818460208d01615308565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b5257615b52615822565b505092915050565b5f8235603e19833603018112615589575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615bac575f80fd5b615bb46155cf565b615bbd83615101565b81526020808401356001600160401b0380821115615bd9575f80fd5b9085019036601f830112615beb575f80fd5b813581811115615bfd57615bfd615593565b8060051b9150615c0e8483016155f1565b8181529183018401918481019036841115615c27575f80fd5b938501935b83851015615c515784359250615c41836153d5565b8282529385019390850190615c2c565b94860194909452509295945050505050565b5f60208284031215615c73575f80fd5b611dc3826151f3565b5f60208284031215615c8c575f80fd5b813560ff81168114611dc3575f80fd5b5f6001600160401b0380831681810361586157615861615822565b5f60208284031215615cc7575f80fd5b8151611dc3816150f4565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d1881602a850160208b01615308565b865190830190615d2f81602a840160208b01615308565b60c087901b6001600160c01b031916602a9290910191820152615d61603282018660e01b6001600160e01b0319169052565b615d7a603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615d9d818460208801615308565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615dd3818460208901615308565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e0e818460208801615308565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161608638038061608683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f398061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615157565b6104b3565b005b610214610224366004615192565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615157565b6106f6565b6102146102693660046151a9565b610701565b61021461027c3660046151f7565b610c2b565b61029461028f366004615192565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615157565b610cf1565b6102146102e9366004615218565b610cfc565b6103016102fc366004615258565b610dbd565b60405190815260200161023f565b61021461031d3660046152bd565b610df2565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d3660046152e5565b61105d565b610294610360366004615192565b611094565b6103015f81565b61021461037a366004615157565b6110a8565b610231603081565b610214610395366004615192565b6110d3565b6102146103a83660046152bd565b61119e565b6103016103bb3660046152fe565b611376565b6102146103ce366004615218565b6113a2565b6103015f80516020615e8d83398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b366004615192565b61152b565b6103015f80516020615ead83398151915281565b610214610442366004615192565b611714565b610231601481565b61046261045d366004615192565b611851565b60405161023f9190615393565b6102946202a30081565b6103015f80516020615e6d83398151915281565b61021461049b366004615427565b6119a0565b6103016104ae366004615465565b611a7f565b6104be838383611ada565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615f0d8339815191526020526040808220815160e0810190925280545f80516020615ead83398151915293929190829060ff1660058111156105355761053561531e565b60058111156105465761054661531e565b815260200160018201805461055a906154d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906154d0565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c61531e565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615508565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611de8565b6040518263ffffffff1660e01b81526004016106b09190615516565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f09190615528565b50505050565b6106f0838383611ada565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615ead8339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190615528565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f4606085016040860161553f565b6001600160a01b03161461083757610812606084016040850161553f565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f610845606085018561555a565b905090505f805b828163ffffffff161015610b2d575f610868606088018861555a565b8363ffffffff1681811061087e5761087e61559f565b905060200281019061089091906155b3565b610899906156d7565b80516040519192505f9160088801916108b191615750565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da9190600401615516565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615750565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109689190615528565b90508086600801835f01516040516109809190615750565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a0261531e565b021790555060208201516001820190610a1b90826157a5565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac0911685615874565b8251604051919550610ad191615750565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615887565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836158a9565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e37565b60400151611f4d565b90505f610b95876120da565b90505f600282604051610ba89190615750565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be69190615528565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c34826122b4565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611851565b5190506002816005811115610c7557610c7561531e565b14610c95578060405163170cc93360e21b81526004016104da9190615508565b6106f083836122ef565b5f805f80516020615e8d83398151915260030154610cbd90846158c0565b9050806001600160401b03165f03610ceb5760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f0838383612569565b610d04612755565b5f80516020615e8d8339815191525f80610d1d8461278c565b91509150610d2a826122b4565b610d3657505050610da4565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6457610d6461531e565b03610d89575f83815260088501602052604081208054919055610d878282612aca565b505b610d9f81610d9a846040015161105d565b612b40565b505050505b610dba60015f80516020615eed83398151915255565b50565b5f610dc6612755565b610dd285858585612b76565b9050610dea60015f80516020615eed83398151915255565b949350505050565b5f8181525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d83398151915293929190829060ff166003811115610e3f57610e3f61531e565b6003811115610e5057610e5061531e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ec682611851565b9050600183516003811115610edd57610edd61531e565b14610efe578251604051633b0d540d60e21b81526104da91906004016158df565b600481516005811115610f1357610f1361531e565b03610f2957610f2185612d4f565b505050505050565b5f80610f40610f3789611e37565b60400151612f36565b5091509150818414610f6d57846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fa65750806001600160401b03168560a001516001600160401b0316115b15610fcf57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610ceb906001600160401b0384166158a9565b5f61109e82611851565b6080015192915050565b6110b3838383612569565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615e8d8339815191525f6110eb83611851565b51905060048160058111156111025761110261531e565b14611122578060405163170cc93360e21b81526004016104da9190615508565b5f8381526005830160205260409020546001600160a01b0316331461116857335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612aca565b6111a6612755565b5f8181525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d83398151915293929190829060ff1660038111156111f3576111f361531e565b60038111156112045761120461531e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561127d5761127d61531e565b1461129e578051604051633b0d540d60e21b81526104da91906004016158df565b60046112ad8260400151611851565b5160058111156112bf576112bf61531e565b14611351575f6112ce85611e37565b90505f806112df8360400151612f36565b50915091508184604001511461130b5760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561134d57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61135a83612d4f565b505061137260015f80516020615eed83398151915255565b5050565b5f61137f612755565b61138a83338461318c565b9050610ceb60015f80516020615eed83398151915255565b5f80516020615ead8339815191525f806113c76113be85611e37565b60400151613464565b91509150806113ed57604051632d07135360e01b815281151560048201526024016104da565b5f82815260068401602052604090208054611407906154d0565b90505f0361142b5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff1660058111156114515761145161531e565b14611484575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615508565b5f828152600684016020526040812061149c916150a6565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d83398151915293929190829060ff1660038111156115785761157861531e565b60038111156115895761158961531e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116025761160261531e565b1415801561162357506003815160038111156116205761162061531e565b14155b15611644578051604051633b0d540d60e21b81526104da91906004016158df565b5f6116528260400151611851565b905080606001516001600160401b03165f03611684576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b1846040015184606001518560800151611de8565b6040518263ffffffff1660e01b81526004016116cd9190615516565b6020604051808303815f875af11580156116e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170d9190615528565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615ead833981519152919061175b906154d0565b90505f0361177f5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117a5576117a561531e565b146117d8575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615508565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161181191906004016158f9565b6020604051808303815f875af115801561182d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190615528565b6118596150dd565b5f8281525f80516020615f0d833981519152602052604090819020815160e0810190925280545f80516020615ead833981519152929190829060ff1660058111156118a6576118a661531e565b60058111156118b7576118b761531e565b81526020016001820180546118cb906154d0565b80601f01602080910402602001604051908101604052809291908181526020018280546118f7906154d0565b80156119425780601f1061191957610100808354040283529160200191611942565b820191905f5260205f20905b81548152906001019060200180831161192557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119e9575080546001600160401b03808416911610155b15611a075760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a328484613620565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615ead833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611ac29086908690615983565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d8339815191529284929091829060ff166003811115611b2857611b2861531e565b6003811115611b3957611b3961531e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611baf82611851565b9050600283516003811115611bc657611bc661531e565b14611be7578251604051633b0d540d60e21b81526104da91906004016158df565b60208301516001600160a01b03163314611c8a575f828152600585016020526040902054336001600160a01b0390911603611c84575f82815260058501602052604090205460a0820151611c4b91600160b01b90046001600160401b031690615992565b6001600160401b0316421015611c7f5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611c8a565b33611143565b600281516005811115611c9f57611c9f61531e565b03611d7c578615611cb657611cb482876122ef565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611cef918491611cea91906159b2565b61363a565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d3084613791565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611de19350505050565b600481516005811115611d9157611d9161531e565b03611dc557611d9f83613791565b5f898152600786016020526040902055611db888612d4f565b6001945050505050611de1565b805160405163170cc93360e21b81526104da9190600401615508565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e9b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ec291908101906159dd565b9150915080611ee457604051636b2f19e960e01b815260040160405180910390fd5b815115611f0a578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f46576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611f8257815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b6002811015611fd157611f99816001615aaf565b611fa49060086158a9565b61ffff16848281518110611fba57611fba61559f565b016020015160f81c901b9190911790600101611f85565b5061ffff811615611ffb5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561205657612012816003615aaf565b61201d9060086158a9565b63ffffffff168561202f836002615874565b8151811061203f5761203f61559f565b016020015160f81c901b9190911790600101611ffe565b5063ffffffff81161561207c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120d15761209381601f615aaf565b61209e9060086158a9565b866120aa836006615874565b815181106120ba576120ba61559f565b016020015160f81c901b919091179060010161207f565b50949350505050565b60605f808335602085013560146120f68787016040890161553f565b612103606089018961555a565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b612189606085018561555a565b9050811015611f4657816121a0606086018661555a565b838181106121b0576121b061559f565b90506020028101906121c291906155b3565b6121cc9080615ac2565b90506121db606087018761555a565b848181106121eb576121eb61559f565b90506020028101906121fd91906155b3565b6122079080615ac2565b612214606089018961555a565b868181106122245761222461559f565b905060200281019061223691906155b3565b612244906020810190615ac2565b61225160608b018b61555a565b888181106122615761226161559f565b905060200281019061227391906155b3565b6122849060608101906040016152e5565b60405160200161229a9796959493929190615b04565b60408051601f19818403018152919052915060010161217c565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561233a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261236191908101906159dd565b915091508061238357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ea9190615528565b825114612410578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561244c576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061245b846040015161392e565b915091508187146124825760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615e8d833981519152906001600160401b03908116908316111561253f575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261255e565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e8d8339815191528161258286613b1f565b905061258d866122b4565b61259c57600192505050611de1565b5f8681526005830160205260409020546001600160a01b031633146125c15733611143565b5f86815260058301602052604090205460a08201516125f091600160b01b90046001600160401b031690615992565b6001600160401b03168160c001516001600160401b031610156126375760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f851561264f5761264887866122ef565b905061266d565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126929061105d565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156126fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271f9190615528565b905080846008015f8a81526020019081526020015f205f8282546127439190615874565b90915550501515979650505050505050565b5f80516020615eed83398151915280546001190161278657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127956150dd565b5f80516020615ead8339815191525f806127b16113be87611e37565b9150915080156127d857604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128095761280961531e565b600581111561281a5761281a61531e565b815260200160018201805461282e906154d0565b80601f016020809104026020016040519081016040528092919081815260200182805461285a906154d0565b80156128a55780601f1061287c576101008083540402835291602001916128a5565b820191905f5260205f20905b81548152906001019060200180831161288857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129105761291061531e565b14158015612931575060018151600581111561292e5761292e61531e565b14155b1561295257805160405163170cc93360e21b81526104da9190600401615508565b6003815160058111156129675761296761531e565b03612975576004815261297a565b600581525b8360080181602001516040516129909190615750565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156129d4576129d461531e565b0217905550602082015160018201906129ed90826157a5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a9357612a9361531e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e6d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b25575f80fd5b505af1158015612b37573d5f803e3d5ffd5b50505050505050565b5f80516020615e6d83398151915254611372906001600160a01b03168383613e03565b60015f80516020615eed83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e8d83398151915290600160401b900461ffff9081169086161080612bca575061271061ffff8616115b15612bee57604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c2a576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c3c5750806001015483115b15612c5d5760405163222d164360e21b8152600481018490526024016104da565b5f612c6784613e62565b90505f612c7382610c9f565b90505f612c808983613e85565b90506040518060800160405280612c943390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d83398151915293929190829060ff166003811115612d9c57612d9c61531e565b6003811115612dad57612dad61531e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612edb575f84815260058701602052604090205461271090612e8d90600160a01b900461ffff16856158a9565b612e9791906158c0565b915081866008015f8681526020019081526020015f205f828254612ebb9190615874565b90915550612ecb90508284615aaf565b9050612edb856020015182612aca565b612ef08560200151610d9a876060015161105d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f6d57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612fbc57612f84816001615aaf565b612f8f9060086158a9565b61ffff16868281518110612fa557612fa561559f565b016020015160f81c901b9190911790600101612f70565b5061ffff811615612fe65760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561304157612ffd816003615aaf565b6130089060086158a9565b63ffffffff168761301a836002615874565b8151811061302a5761302a61559f565b016020015160f81c901b9190911790600101612fe9565b5063ffffffff811660031461306957604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130be5761308081601f615aaf565b61308b9060086158a9565b88613097836006615874565b815181106130a7576130a761559f565b016020015160f81c901b919091179060010161306c565b505f805b600881101561311d576130d6816007615aaf565b6130e19060086158a9565b6001600160401b0316896130f6836026615874565b815181106131065761310661559f565b016020015160f81c901b91909117906001016130c2565b505f805b600881101561317c57613135816007615aaf565b6131409060086158a9565b6001600160401b03168a61315583602e615874565b815181106131655761316561559f565b016020015160f81c901b9190911790600101613121565b5091989097509095509350505050565b5f5f80516020615e8d833981519152816131a861028f85613e62565b90505f6131b487611851565b90506131bf876122b4565b6131df576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156131f4576131f461531e565b1461321557805160405163170cc93360e21b81526104da9190600401615508565b5f8282608001516132269190615992565b905083600201600a9054906101000a90046001600160401b0316826040015161324f9190615b6d565b6001600160401b0316816001600160401b0316111561328c57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132988a8461363a565b915091505f8a836040516020016132c692919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156133595761335961531e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461349a57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156134e9576134b1816001615aaf565b6134bc9060086158a9565b61ffff168582815181106134d2576134d261559f565b016020015160f81c901b919091179060010161349d565b5061ffff8116156135135760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561356e5761352a816003615aaf565b6135359060086158a9565b63ffffffff1686613547836002615874565b815181106135575761355761559f565b016020015160f81c901b9190911790600101613516565b5063ffffffff811660021461359657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135eb576135ad81601f615aaf565b6135b89060086158a9565b876135c4836006615874565b815181106135d4576135d461559f565b016020015160f81c901b9190911790600101613599565b505f866026815181106136005761360061559f565b016020015191976001600160f81b03199092161515965090945050505050565b6136286143fd565b61363182614448565b611372816144bc565b5f8281525f80516020615f0d833981519152602052604081206002015481905f80516020615ead83398151915290600160801b90046001600160401b03166136828582614524565b5f61368c87614747565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136dc8a858b611de8565b6040518263ffffffff1660e01b81526004016136f89190615516565b6020604051808303815f875af1158015613714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137389190615528565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e8d83398151915290505f6137b18460400151611851565b90505f6003825160058111156137c9576137c961531e565b14806137e757506004825160058111156137e5576137e561531e565b145b156137f7575060c0810151613834565b60028251600581111561380c5761380c61531e565b03613818575042613834565b815160405163170cc93360e21b81526104da9190600401615508565b84608001516001600160401b0316816001600160401b03161161385b57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138809061105d565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613901573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139259190615528565b95945050505050565b5f808251602e1461396457825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b60028110156139b35761397b816001615aaf565b6139869060086158a9565b61ffff1685828151811061399c5761399c61559f565b016020015160f81c901b9190911790600101613967565b5061ffff8116156139dd5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a38576139f4816003615aaf565b6139ff9060086158a9565b63ffffffff1686613a11836002615874565b81518110613a2157613a2161559f565b016020015160f81c901b91909117906001016139e0565b5063ffffffff811615613a5e57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613ab357613a7581601f615aaf565b613a809060086158a9565b87613a8c836006615874565b81518110613a9c57613a9c61559f565b016020015160f81c901b9190911790600101613a61565b505f805b6008811015613b1257613acb816007615aaf565b613ad69060086158a9565b6001600160401b031688613aeb836026615874565b81518110613afb57613afb61559f565b016020015160f81c901b9190911790600101613ab7565b5090969095509350505050565b613b276150dd565b5f8281525f80516020615f0d8339815191526020526040808220815160e0810190925280545f80516020615ead83398151915293929190829060ff166005811115613b7457613b7461531e565b6005811115613b8557613b8561531e565b8152602001600182018054613b99906154d0565b80601f0160208091040260200160405190810160405280929190818152602001828054613bc5906154d0565b8015613c105780601f10613be757610100808354040283529160200191613c10565b820191905f5260205f20905b815481529060010190602001808311613bf357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c7e57613c7e61531e565b14613cb1575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615508565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cf557613cf561531e565b021790555060208201516001820190613d0e90826157a5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613dac858261363a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506147bc565b5f610ceb825f80516020615e6d833981519152546001600160a01b03169061481d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ec957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ead83398151915242613ee860608601604087016152e5565b6001600160401b0316111580613f225750613f066202a30042615874565b613f1660608601604087016152e5565b6001600160401b031610155b15613f5c57613f3760608501604086016152e5565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f71613f6c6060860186615b98565b614976565b613f81613f6c6080860186615b98565b6030613f906020860186615ac2565b905014613fc257613fa46020850185615ac2565b6040516326475b2f60e11b81526104da925060040190815260200190565b613fcc8480615ac2565b90505f03613ff957613fde8480615ac2565b604051633e08a12560e11b81526004016104da929190615bac565b5f600882016140088680615ac2565b604051614016929190615983565b9081526020016040518091039020541461404f576140348480615ac2565b60405163a41f772f60e01b81526004016104da929190615bac565b614059835f614524565b6040805160e08101909152815481525f908190614165906020810161407e8980615ac2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906140c6908a018a615ac2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161410f60608a0160408b016152e5565b6001600160401b0316815260200161412a60608a018a615b98565b61413390615bda565b815260200161414560808a018a615b98565b61414e90615bda565b8152602001876001600160401b0316815250614adf565b5f8281526006860160205260409020919350915061418382826157a5565b5081600884016141938880615ac2565b6040516141a1929190615983565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141dd908590600401615516565b6020604051808303815f875af11580156141f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061421d9190615528565b6040805160e08101909152909150806001815260200161423d8980615ac2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156142cc576142cc61531e565b0217905550602082015160018201906142e590826157a5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143838880615ac2565b604051614391929190615983565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906143cf91906152e5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661444657604051631afcd79f60e31b815260040160405180910390fd5b565b6144506143fd565b61445981614ccc565b614461614ce5565b610dba6060820135608083013561447e60c0850160a086016152e5565b61448e60e0860160c08701615ca1565b61449f610100870160e08801615cba565b6101008701356144b761014089016101208a0161553f565b614cf5565b6144c46143fd565b5f80516020615e6d8339815191526001600160a01b03821661450457604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615ead8339815191525f6001600160401b0380841690851611156145585761455183856159b2565b9050614565565b61456284846159b2565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145c75750600184015481516145c3916001600160401b031690615874565b8210155b156145ed576001600160401b03831660608201528181526040810151602082015261460c565b82816060018181516145ff9190615992565b6001600160401b03169052505b606081015161461c906064615b6d565b602082015160018601546001600160401b0392909216916146479190600160401b900460ff166158a9565b101561467757606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146929190615874565b9052506040810180516001600160401b03871691906146b2908390615aaf565b905250600184015460408201516064916146d791600160401b90910460ff16906158a9565b10156146fe578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f0d8339815191526020526040812060020180545f80516020615ead833981519152919060089061479190600160401b90046001600160401b0316615cda565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147d06001600160a01b03841683614e4a565b905080515f141580156147f45750808060200190518101906147f29190615cf5565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614863573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148879190615528565b905061489e6001600160a01b038516333086614e57565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156148e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149069190615528565b905081811161496c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139258282615aaf565b6149836020820182615218565b63ffffffff161580156149a3575061499e602082018261555a565b151590505b156149ea576149b56020820182615218565b6149c2602083018361555a565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b6149f7602082018261555a565b9050614a066020830183615218565b63ffffffff161115614a1f576149b56020820182615218565b60015b614a2f602083018361555a565b905081101561137257614a45602083018361555a565b614a50600184615aaf565b818110614a5f57614a5f61559f565b9050602002016020810190614a74919061553f565b6001600160a01b0316614a8a602084018461555a565b83818110614a9a57614a9a61559f565b9050602002016020810190614aaf919061553f565b6001600160a01b03161015614ad757604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a22565b5f6060826040015151603014614b085760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b49988a986001989297929690959094909390929101615d10565b60405160208183030381529060405290505f5b84608001516020015151811015614bbb57818560800151602001518281518110614b8857614b8861559f565b6020026020010151604051602001614ba1929190615dca565b60408051601f198184030181529190529150600101614b5c565b5060a0840151805160209182015151604051614bdb938593929101615e00565b60405160208183030381529060405290505f5b8460a001516020015151811015614c4d57818560a00151602001518281518110614c1a57614c1a61559f565b6020026020010151604051602001614c33929190615dca565b60408051601f198184030181529190529150600101614bee565b5060c0840151604051614c64918391602001615e3b565b6040516020818303038152906040529050600281604051614c859190615750565b602060405180830381855afa158015614ca0573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614cc39190615528565b94909350915050565b614cd46143fd565b614cdc614e90565b610dba81614e98565b614ced6143fd565b614446614f80565b614cfd6143fd565b5f80516020615e8d83398151915261ffff85161580614d21575061271061ffff8616115b15614d4557604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614d695760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614d7c5750600a60ff8516115b15614d9f5760405163170db35960e31b815260ff851660048201526024016104da565b825f03614dbf5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611de183835f614f88565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e30565b6144466143fd565b614ea06143fd565b80355f80516020615ead8339815191529081556014614ec56060840160408501615cba565b60ff161180614ee45750614edf6060830160408401615cba565b60ff16155b15614f1857614ef96060830160408401615cba565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614f286060830160408401615cba565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f5960408301602084016152e5565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b636143fd565b606081471015614fad5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614fc89190615750565b5f6040518083038185875af1925050503d805f8114615002576040519150601f19603f3d011682016040523d82523d5f602084013e615007565b606091505b5091509150615017868383615021565b9695505050505050565b606082615036576150318261507d565b611de1565b815115801561504d57506001600160a01b0384163b155b1561507657604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611de1565b80511561508d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546150b2906154d0565b5f825580601f106150c1575050565b601f0160209004905f5260205f2090810190610dba919061511a565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b8082111561512e575f815560010161511b565b5090565b8015158114610dba575f80fd5b803563ffffffff81168114615152575f80fd5b919050565b5f805f60608486031215615169575f80fd5b83359250602084013561517b81615132565b91506151896040850161513f565b90509250925092565b5f602082840312156151a2575f80fd5b5035919050565b5f80604083850312156151ba575f80fd5b82356001600160401b038111156151cf575f80fd5b8301608081860312156151e0575f80fd5b91506151ee6020840161513f565b90509250929050565b5f8060408385031215615208575f80fd5b823591506151ee6020840161513f565b5f60208284031215615228575f80fd5b611de18261513f565b803561ffff81168114615152575f80fd5b80356001600160401b0381168114615152575f80fd5b5f805f806080858703121561526b575f80fd5b84356001600160401b03811115615280575f80fd5b850160a08188031215615291575f80fd5b935061529f60208601615231565b92506152ad60408601615242565b9396929550929360600135925050565b5f80604083850312156152ce575f80fd5b6152d78361513f565b946020939093013593505050565b5f602082840312156152f5575f80fd5b611de182615242565b5f806040838503121561530f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106153425761534261531e565b9052565b5f5b83811015615360578181015183820152602001615348565b50505f910152565b5f815180845261537f816020860160208601615346565b601f01601f19169290920160200192915050565b602081526153a5602082018351615332565b5f602083015160e060408401526153c0610100840182615368565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dba575f80fd5b5f8082840361016081121561543a575f80fd5b61014080821215615449575f80fd5b849350830135905061545a81615413565b809150509250929050565b5f8060208385031215615476575f80fd5b82356001600160401b038082111561548c575f80fd5b818501915085601f83011261549f575f80fd5b8135818111156154ad575f80fd5b8660208285010111156154be575f80fd5b60209290920196919550909350505050565b600181811c908216806154e457607f821691505b60208210810361550257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ceb8284615332565b602081525f611de16020830184615368565b5f60208284031215615538575f80fd5b5051919050565b5f6020828403121561554f575f80fd5b8135611de181615413565b5f808335601e1984360301811261556f575f80fd5b8301803591506001600160401b03821115615588575f80fd5b6020019150600581901b360382131561378a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155c7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615607576156076155d1565b60405290565b604080519081016001600160401b0381118282101715615607576156076155d1565b604051601f8201601f191681016001600160401b0381118282101715615657576156576155d1565b604052919050565b5f6001600160401b03821115615677576156776155d1565b50601f01601f191660200190565b5f82601f830112615694575f80fd5b81356156a76156a28261565f565b61562f565b8181528460208386010111156156bb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156156e7575f80fd5b6156ef6155e5565b82356001600160401b0380821115615705575f80fd5b61571136838701615685565b83526020850135915080821115615726575f80fd5b5061573336828601615685565b60208301525061574560408401615242565b604082015292915050565b5f82516155c7818460208701615346565b601f8211156104e357805f5260205f20601f840160051c810160208510156157865750805b601f840160051c820191505b8181101561170d575f8155600101615792565b81516001600160401b038111156157be576157be6155d1565b6157d2816157cc84546154d0565b84615761565b602080601f831160018114615805575f84156157ee5750858301515b5f19600386901b1c1916600185901b178555610f21565b5f85815260208120601f198616915b8281101561583357888601518255948401946001909101908401615814565b508582101561585057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ceb57610ceb615860565b5f63ffffffff80831681810361589f5761589f615860565b6001019392505050565b8082028115828204841417610ceb57610ceb615860565b5f826158da57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106158f3576158f361531e565b91905290565b5f60208083525f845461590b816154d0565b806020870152604060018084165f811461592c576001811461594857615975565b60ff19851660408a0152604084151560051b8a01019550615975565b895f5260205f205f5b8581101561596c5781548b8201860152908301908801615951565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f4657611f46615860565b6001600160401b03828116828216039080821115611f4657611f46615860565b805161515281615132565b5f80604083850312156159ee575f80fd5b82516001600160401b0380821115615a04575f80fd5b9084019060608287031215615a17575f80fd5b615a1f6155e5565b82518152602080840151615a3281615413565b82820152604084015183811115615a47575f80fd5b80850194505087601f850112615a5b575f80fd5b83519250615a6b6156a28461565f565b8381528882858701011115615a7e575f80fd5b615a8d84838301848801615346565b80604084015250819550615aa28188016159d2565b9450505050509250929050565b81810381811115610ceb57610ceb615860565b5f808335601e19843603018112615ad7575f80fd5b8301803591506001600160401b03821115615af0575f80fd5b60200191503681900382131561378a575f80fd5b5f8851615b15818460208d01615346565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b9057615b90615860565b505092915050565b5f8235603e198336030181126155c7575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615bea575f80fd5b615bf261560d565b615bfb8361513f565b81526020808401356001600160401b0380821115615c17575f80fd5b9085019036601f830112615c29575f80fd5b813581811115615c3b57615c3b6155d1565b8060051b9150615c4c84830161562f565b8181529183018401918481019036841115615c65575f80fd5b938501935b83851015615c8f5784359250615c7f83615413565b8282529385019390850190615c6a565b94860194909452509295945050505050565b5f60208284031215615cb1575f80fd5b611de182615231565b5f60208284031215615cca575f80fd5b813560ff81168114611de1575f80fd5b5f6001600160401b0380831681810361589f5761589f615860565b5f60208284031215615d05575f80fd5b8151611de181615132565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d5681602a850160208b01615346565b865190830190615d6d81602a840160208b01615346565b60c087901b6001600160c01b031916602a9290910191820152615d9f603282018660e01b6001600160e01b0319169052565b615db8603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ddb818460208801615346565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615e11818460208901615346565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e4c818460208801615346565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index e15570fc3..bc76239ee 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -91,8 +91,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d53380380615d5383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c068061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614ebd565b610615565b005b348015610221575f80fd5b50610214610230366004614ef8565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614ebd565b610858565b34801561028a575f80fd5b50610214610299366004614f0f565b610863565b3480156102a9575f80fd5b506102146102b8366004614f5d565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614ef8565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614ebd565b610e35565b348015610378575f80fd5b50610214610387366004614f7e565b610e40565b348015610397575f80fd5b506102146103a6366004614f97565b610f01565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004614fd5565b61116c565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614ef8565b6111a3565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614ebd565b6111b7565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614ef8565b6111e2565b348015610490575f80fd5b5061021461049f366004614f97565b6112ad565b3480156104af575f80fd5b506102146104be366004614f7e565b611485565b6103f36104d1366004614fff565b61160e565b3480156104e1575f80fd5b506103f35f80516020615b5a83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614ef8565b611642565b34801561053a575f80fd5b506103f35f80516020615b7a83398151915281565b34801561055a575f80fd5b50610214610569366004614ef8565b61182b565b348015610579575f80fd5b50610214610588366004615053565b611968565b6103f361059b366004614ef8565b611a45565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614ef8565b611a76565b60405161025791906150df565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f361061036600461515f565b611bc5565b610620838383611c20565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615bda8339815191526020526040808220815160e0810190925280545f80516020615b7a83398151915293929190829060ff1660058111156106975761069761506a565b60058111156106a8576106a861506a565b81526020016001820180546106bc906151ca565b80601f01602080910402602001604051908101604052809291908181526020018280546106e8906151ca565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e61506a565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151fc565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f27565b6040518263ffffffff1660e01b8152600401610812919061520a565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061521c565b50505050565b610852838383611c20565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615b7a8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c919061521c565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b306109566060850160408601615247565b6001600160a01b031614610999576109746060840160408501615247565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a76060850185615262565b905090505f805b828163ffffffff161015610c8f575f6109ca6060880188615262565b8363ffffffff168181106109e0576109e06152a7565b90506020028101906109f291906152bb565b6109fb906153df565b80516040519192505f916008880191610a1391615458565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161520a565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c91615458565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca919061521c565b90508086600801835f0151604051610ae29190615458565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b6461506a565b021790555060208201516001820190610b7d90826154ad565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c2291168561557c565b8251604051919550610c3391615458565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c889061558f565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836155b1565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611f76565b6040015161208c565b90505f610cf787612219565b90505f600282604051610d0a9190615458565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d48919061521c565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d96826123f3565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a76565b5190506002816005811115610dd757610dd761506a565b14610df7578060405163170cc93360e21b815260040161063c91906151fc565b610852838361242e565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e2f90836155c8565b92915050565b6108528383836126a8565b610e48612894565b5f80516020615b5a8339815191525f80610e61846128cb565b91509150610e6e826123f3565b610e7a57505050610ee8565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ea857610ea861506a565b03610ecd575f83815260088501602052604081208054919055610ecb8282612c09565b505b610ee381610ede846040015161116c565b612c67565b505050505b610efe60015f80516020615bba83398151915255565b50565b5f8181525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a83398151915293929190829060ff166003811115610f4e57610f4e61506a565b6003811115610f5f57610f5f61506a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610fd582611a76565b9050600183516003811115610fec57610fec61506a565b1461100d578251604051633b0d540d60e21b815261063c91906004016155e7565b6004815160058111156110225761102261506a565b036110385761103085612c8d565b505050505050565b5f8061104f61104689611f76565b60400151612e74565b509150915081841461107c57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110b55750806001600160401b03168560a001516001600160401b0316115b156110de57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e2f906001600160401b0384166155b1565b5f6111ad82611a76565b6080015192915050565b6111c28383836126a8565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615b5a8339815191525f6111fa83611a76565b51905060048160058111156112115761121161506a565b14611231578060405163170cc93360e21b815260040161063c91906151fc565b5f8381526005830160205260409020546001600160a01b0316331461127757335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c09565b6112b5612894565b5f8181525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a83398151915293929190829060ff1660038111156113025761130261506a565b60038111156113135761131361506a565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561138c5761138c61506a565b146113ad578051604051633b0d540d60e21b815261063c91906004016155e7565b60046113bc8260400151611a76565b5160058111156113ce576113ce61506a565b14611460575f6113dd85611f76565b90505f806113ee8360400151612e74565b50915091508184604001511461141a5760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561145c57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61146983612c8d565b505061148160015f80516020615bba83398151915255565b5050565b5f80516020615b7a8339815191525f806114aa6114a185611f76565b604001516130ca565b91509150806114d057604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546114ea906151ca565b90505f0361150e5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff1660058111156115345761153461506a565b14611567575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151fc565b5f828152600684016020526040812061157f91614e11565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611617612894565b61162384848434613286565b905061163b60015f80516020615bba83398151915255565b9392505050565b5f8181525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a83398151915293929190829060ff16600381111561168f5761168f61506a565b60038111156116a0576116a061506a565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117195761171961506a565b1415801561173a57506003815160038111156117375761173761506a565b14155b1561175b578051604051633b0d540d60e21b815261063c91906004016155e7565b5f6117698260400151611a76565b905080606001516001600160401b03165f0361179b576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117c8846040015184606001518560800151611f27565b6040518263ffffffff1660e01b81526004016117e4919061520a565b6020604051808303815f875af1158015611800573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611824919061521c565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615b7a8339815191529190611872906151ca565b90505f036118965760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118bc576118bc61506a565b146118ef575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151fc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119289190600401615601565b6020604051808303815f875af1158015611944573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610645919061521c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119b1575080546001600160401b03808416911610155b156119cf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119f983613454565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a4e612894565b611a59823334613465565b9050611a7160015f80516020615bba83398151915255565b919050565b611a7e614e48565b5f8281525f80516020615bda833981519152602052604090819020815160e0810190925280545f80516020615b7a833981519152929190829060ff166005811115611acb57611acb61506a565b6005811115611adc57611adc61506a565b8152602001600182018054611af0906151ca565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1c906151ca565b8015611b675780601f10611b3e57610100808354040283529160200191611b67565b820191905f5260205f20905b815481529060010190602001808311611b4a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615b7a833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c08908690869061568b565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a8339815191529284929091829060ff166003811115611c6e57611c6e61506a565b6003811115611c7f57611c7f61506a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611cf582611a76565b9050600283516003811115611d0c57611d0c61506a565b14611d2d578251604051633b0d540d60e21b815261063c91906004016155e7565b60208301516001600160a01b03163314611dd0575f828152600585016020526040902054336001600160a01b0390911603611dca575f82815260058501602052604090205460a0820151611d9191600160b01b90046001600160401b03169061569a565b6001600160401b0316421015611dc55760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611dd0565b33611252565b600281516005811115611de557611de561506a565b03611ec2578615611dfc57611dfa828761242e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611e35918491611e3091906156ba565b61373a565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e7684613891565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a31515945061163b9350505050565b600481516005811115611ed757611ed761506a565b03611f0b57611ee583613891565b5f898152600786016020526040902055611efe88612c8d565b600194505050505061163b565b805160405163170cc93360e21b815261063c91906004016151fc565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fda573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261200191908101906156e5565b915091508061202357604051636b2f19e960e01b815260040160405180910390fd5b815115612049578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612085576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f81516026146120c157815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b6002811015612110576120d88160016157b7565b6120e39060086155b1565b61ffff168482815181106120f9576120f96152a7565b016020015160f81c901b91909117906001016120c4565b5061ffff81161561213a5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612195576121518160036157b7565b61215c9060086155b1565b63ffffffff168561216e83600261557c565b8151811061217e5761217e6152a7565b016020015160f81c901b919091179060010161213d565b5063ffffffff8116156121bb57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612210576121d281601f6157b7565b6121dd9060086155b1565b866121e983600661557c565b815181106121f9576121f96152a7565b016020015160f81c901b91909117906001016121be565b50949350505050565b60605f8083356020850135601461223587870160408901615247565b6122426060890189615262565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6122c86060850185615262565b905081101561208557816122df6060860186615262565b838181106122ef576122ef6152a7565b905060200281019061230191906152bb565b61230b90806157ca565b905061231a6060870187615262565b8481811061232a5761232a6152a7565b905060200281019061233c91906152bb565b61234690806157ca565b6123536060890189615262565b86818110612363576123636152a7565b905060200281019061237591906152bb565b6123839060208101906157ca565b61239060608b018b615262565b888181106123a0576123a06152a7565b90506020028101906123b291906152bb565b6123c3906060810190604001614fd5565b6040516020016123d9979695949392919061580c565b60408051601f1981840301815291905291506001016122bb565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612479573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124a091908101906156e5565b91509150806124c257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612505573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612529919061521c565b82511461254f578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b03161561258b576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f8061259a8460400151613a2e565b915091508187146125c15760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615b5a833981519152906001600160401b03908116908316111561267e575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261269d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b5a833981519152816126c186613c1f565b90506126cc866123f3565b6126db5760019250505061163b565b5f8681526005830160205260409020546001600160a01b031633146127005733611252565b5f86815260058301602052604090205460a082015161272f91600160b01b90046001600160401b03169061569a565b6001600160401b03168160c001516001600160401b031610156127765760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f851561278e57612787878661242e565b90506127ac565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127d19061116c565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561283a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061285e919061521c565b905080846008015f8a81526020019081526020015f205f828254612882919061557c565b90915550501515979650505050505050565b5f80516020615bba8339815191528054600119016128c557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128d4614e48565b5f80516020615b7a8339815191525f806128f06114a187611f76565b91509150801561291757604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156129485761294861506a565b60058111156129595761295961506a565b815260200160018201805461296d906151ca565b80601f0160208091040260200160405190810160405280929190818152602001828054612999906151ca565b80156129e45780601f106129bb576101008083540402835291602001916129e4565b820191905f5260205f20905b8154815290600101906020018083116129c757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a4f57612a4f61506a565b14158015612a705750600181516005811115612a6d57612a6d61506a565b14155b15612a9157805160405163170cc93360e21b815261063c91906004016151fc565b600381516005811115612aa657612aa661506a565b03612ab45760048152612ab9565b600581525b836008018160200151604051612acf9190615458565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b1357612b1361506a565b021790555060208201516001820190612b2c90826154ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bd257612bd261506a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c55575f80fd5b505af1158015611030573d5f803e3d5ffd5b6114816001600160a01b03831682613f03565b60015f80516020615bba83398151915255565b5f8181525f80516020615b9a8339815191526020526040808220815160e0810190925280545f80516020615b5a83398151915293929190829060ff166003811115612cda57612cda61506a565b6003811115612ceb57612ceb61506a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e19575f84815260058701602052604090205461271090612dcb90600160a01b900461ffff16856155b1565b612dd591906155c8565b915081866008015f8681526020019081526020015f205f828254612df9919061557c565b90915550612e09905082846157b7565b9050612e19856020015182612c09565b612e2e8560200151610ede876060015161116c565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612eab57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612efa57612ec28160016157b7565b612ecd9060086155b1565b61ffff16868281518110612ee357612ee36152a7565b016020015160f81c901b9190911790600101612eae565b5061ffff811615612f245760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f7f57612f3b8160036157b7565b612f469060086155b1565b63ffffffff1687612f5883600261557c565b81518110612f6857612f686152a7565b016020015160f81c901b9190911790600101612f27565b5063ffffffff8116600314612fa757604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612ffc57612fbe81601f6157b7565b612fc99060086155b1565b88612fd583600661557c565b81518110612fe557612fe56152a7565b016020015160f81c901b9190911790600101612faa565b505f805b600881101561305b576130148160076157b7565b61301f9060086155b1565b6001600160401b03168961303483602661557c565b81518110613044576130446152a7565b016020015160f81c901b9190911790600101613000565b505f805b60088110156130ba576130738160076157b7565b61307e9060086155b1565b6001600160401b03168a61309383602e61557c565b815181106130a3576130a36152a7565b016020015160f81c901b919091179060010161305f565b5091989097509095509350505050565b5f80825160271461310057825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561314f576131178160016157b7565b6131229060086155b1565b61ffff16858281518110613138576131386152a7565b016020015160f81c901b9190911790600101613103565b5061ffff8116156131795760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131d4576131908160036157b7565b61319b9060086155b1565b63ffffffff16866131ad83600261557c565b815181106131bd576131bd6152a7565b016020015160f81c901b919091179060010161317c565b5063ffffffff81166002146131fc57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132515761321381601f6157b7565b61321e9060086155b1565b8761322a83600661557c565b8151811061323a5761323a6152a7565b016020015160f81c901b91909117906001016131ff565b505f86602681518110613266576132666152a7565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b5a83398151915290600160401b900461ffff90811690861610806132da575061271061ffff8616115b156132fe57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b03908116908516101561333a576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b805483108061334c5750806001015483115b1561336d5760405163222d164360e21b81526004810184905260240161063c565b825f61337882610e01565b90505f6133858983613f96565b905060405180608001604052806133993390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61345c61450e565b610efe81614559565b5f5f80516020615b5a8339815191528161347e84610e01565b90505f61348a87611a76565b9050613495876123f3565b6134b5576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156134ca576134ca61506a565b146134eb57805160405163170cc93360e21b815261063c91906004016151fc565b5f8282608001516134fc919061569a565b905083600201600a9054906101000a90046001600160401b031682604001516135259190615875565b6001600160401b0316816001600160401b0316111561356257604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061356e8a8461373a565b915091505f8a8360405160200161359c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561362f5761362f61506a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615bda833981519152602052604081206002015481905f80516020615b7a83398151915290600160801b90046001600160401b031661378285826145cd565b5f61378c876147f0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137dc8a858b611f27565b6040518263ffffffff1660e01b81526004016137f8919061520a565b6020604051808303815f875af1158015613814573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613838919061521c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b5a83398151915290505f6138b18460400151611a76565b90505f6003825160058111156138c9576138c961506a565b14806138e757506004825160058111156138e5576138e561506a565b145b156138f7575060c0810151613934565b60028251600581111561390c5761390c61506a565b03613918575042613934565b815160405163170cc93360e21b815261063c91906004016151fc565b84608001516001600160401b0316816001600160401b03161161395b57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139809061116c565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a25919061521c565b95945050505050565b5f808251602e14613a6457825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613ab357613a7b8160016157b7565b613a869060086155b1565b61ffff16858281518110613a9c57613a9c6152a7565b016020015160f81c901b9190911790600101613a67565b5061ffff811615613add5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b3857613af48160036157b7565b613aff9060086155b1565b63ffffffff1686613b1183600261557c565b81518110613b2157613b216152a7565b016020015160f81c901b9190911790600101613ae0565b5063ffffffff811615613b5e57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bb357613b7581601f6157b7565b613b809060086155b1565b87613b8c83600661557c565b81518110613b9c57613b9c6152a7565b016020015160f81c901b9190911790600101613b61565b505f805b6008811015613c1257613bcb8160076157b7565b613bd69060086155b1565b6001600160401b031688613beb83602661557c565b81518110613bfb57613bfb6152a7565b016020015160f81c901b9190911790600101613bb7565b5090969095509350505050565b613c27614e48565b5f8281525f80516020615bda8339815191526020526040808220815160e0810190925280545f80516020615b7a83398151915293929190829060ff166005811115613c7457613c7461506a565b6005811115613c8557613c8561506a565b8152602001600182018054613c99906151ca565b80601f0160208091040260200160405190810160405280929190818152602001828054613cc5906151ca565b8015613d105780601f10613ce757610100808354040283529160200191613d10565b820191905f5260205f20905b815481529060010190602001808311613cf357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d7e57613d7e61506a565b14613db1575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016151fc565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613df557613df561506a565b021790555060208201516001820190613e0e90826154ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613eac858261373a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f265760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f6f576040519150601f19603f3d011682016040523d82523d5f602084013e613f74565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fda57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615b7a83398151915242613ff96060860160408701614fd5565b6001600160401b031611158061403357506140176202a3004261557c565b6140276060860160408701614fd5565b6001600160401b031610155b1561406d576140486060850160408601614fd5565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61408261407d60608601866158a0565b614865565b61409261407d60808601866158a0565b60306140a160208601866157ca565b9050146140d3576140b560208501856157ca565b6040516326475b2f60e11b815261063c925060040190815260200190565b6140dd84806157ca565b90505f0361410a576140ef84806157ca565b604051633e08a12560e11b815260040161063c9291906158b4565b5f6008820161411986806157ca565b60405161412792919061568b565b908152602001604051809103902054146141605761414584806157ca565b60405163a41f772f60e01b815260040161063c9291906158b4565b61416a835f6145cd565b6040805160e08101909152815481525f908190614276906020810161418f89806157ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141d7908a018a6157ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161422060608a0160408b01614fd5565b6001600160401b0316815260200161423b60608a018a6158a0565b614244906158e2565b815260200161425660808a018a6158a0565b61425f906158e2565b8152602001876001600160401b03168152506149ce565b5f8281526006860160205260409020919350915061429482826154ad565b5081600884016142a488806157ca565b6040516142b292919061568b565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142ee90859060040161520a565b6020604051808303815f875af115801561430a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061432e919061521c565b6040805160e08101909152909150806001815260200161434e89806157ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143dd576143dd61506a565b0217905550602082015160018201906143f690826154ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061449488806157ca565b6040516144a292919061568b565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144e09190614fd5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661455757604051631afcd79f60e31b815260040160405180910390fd5b565b61456161450e565b61456a81614bbb565b614572614bd4565b610efe6060820135608083013561458f60c0850160a08601614fd5565b61459f60e0860160c087016159a9565b6145b0610100870160e088016159c2565b6101008701356145c861014089016101208a01615247565b614be4565b5f80516020615b7a8339815191525f6001600160401b038084169085161115614601576145fa83856156ba565b905061460e565b61460b84846156ba565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061467057506001840154815161466c916001600160401b03169061557c565b8210155b15614696576001600160401b0383166060820152818152604081015160208201526146b5565b82816060018181516146a8919061569a565b6001600160401b03169052505b60608101516146c5906064615875565b602082015160018601546001600160401b0392909216916146f09190600160401b900460ff166155b1565b101561472057606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161473b919061557c565b9052506040810180516001600160401b038716919061475b9083906157b7565b9052506001840154604082015160649161478091600160401b90910460ff16906155b1565b10156147a7578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bda8339815191526020526040812060020180545f80516020615b7a833981519152919060089061483a90600160401b90046001600160401b03166159e2565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148726020820182614f7e565b63ffffffff16158015614892575061488d6020820182615262565b151590505b156148d9576148a46020820182614f7e565b6148b16020830183615262565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6148e66020820182615262565b90506148f56020830183614f7e565b63ffffffff16111561490e576148a46020820182614f7e565b60015b61491e6020830183615262565b9050811015611481576149346020830183615262565b61493f6001846157b7565b81811061494e5761494e6152a7565b90506020020160208101906149639190615247565b6001600160a01b03166149796020840184615262565b83818110614989576149896152a7565b905060200201602081019061499e9190615247565b6001600160a01b031610156149c657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614911565b5f60608260400151516030146149f75760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a38988a9860019892979296909590949093909291016159fd565b60405160208183030381529060405290505f5b84608001516020015151811015614aaa57818560800151602001518281518110614a7757614a776152a7565b6020026020010151604051602001614a90929190615ab7565b60408051601f198184030181529190529150600101614a4b565b5060a0840151805160209182015151604051614aca938593929101615aed565b60405160208183030381529060405290505f5b8460a001516020015151811015614b3c57818560a00151602001518281518110614b0957614b096152a7565b6020026020010151604051602001614b22929190615ab7565b60408051601f198184030181529190529150600101614add565b5060c0840151604051614b53918391602001615b28565b6040516020818303038152906040529050600281604051614b749190615458565b602060405180830381855afa158015614b8f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bb2919061521c565b94909350915050565b614bc361450e565b614bcb614d19565b610efe81614d21565b614bdc61450e565b614557614e09565b614bec61450e565b5f80516020615b5a83398151915261ffff85161580614c10575061271061ffff8616115b15614c3457604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614c585760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614c6b5750600a60ff8516115b15614c8e5760405163170db35960e31b815260ff8516600482015260240161063c565b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61455761450e565b614d2961450e565b80355f80516020615b7a8339815191529081556014614d4e60608401604085016159c2565b60ff161180614d6d5750614d6860608301604084016159c2565b60ff16155b15614da157614d8260608301604084016159c2565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614db160608301604084016159c2565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614de26040830160208401614fd5565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c7a61450e565b508054614e1d906151ca565b5f825580601f10614e2c575050565b601f0160209004905f5260205f2090810190610efe9190614e85565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e99575f8155600101614e86565b5090565b8015158114610efe575f80fd5b803563ffffffff81168114611a71575f80fd5b5f805f60608486031215614ecf575f80fd5b833592506020840135614ee181614e9d565b9150614eef60408501614eaa565b90509250925092565b5f60208284031215614f08575f80fd5b5035919050565b5f8060408385031215614f20575f80fd5b82356001600160401b03811115614f35575f80fd5b830160808186031215614f46575f80fd5b9150614f5460208401614eaa565b90509250929050565b5f8060408385031215614f6e575f80fd5b82359150614f5460208401614eaa565b5f60208284031215614f8e575f80fd5b61163b82614eaa565b5f8060408385031215614fa8575f80fd5b614fb183614eaa565b946020939093013593505050565b80356001600160401b0381168114611a71575f80fd5b5f60208284031215614fe5575f80fd5b61163b82614fbf565b803561ffff81168114611a71575f80fd5b5f805f60608486031215615011575f80fd5b83356001600160401b03811115615026575f80fd5b840160a08187031215615037575f80fd5b925061504560208501614fee565b9150614eef60408501614fbf565b5f6101408284031215615064575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061508e5761508e61506a565b9052565b5f5b838110156150ac578181015183820152602001615094565b50505f910152565b5f81518084526150cb816020860160208601615092565b601f01601f19169290920160200192915050565b602081526150f160208201835161507e565b5f602083015160e0604084015261510c6101008401826150b4565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615170575f80fd5b82356001600160401b0380821115615186575f80fd5b818501915085601f830112615199575f80fd5b8135818111156151a7575f80fd5b8660208285010111156151b8575f80fd5b60209290920196919550909350505050565b600181811c908216806151de57607f821691505b60208210810361506457634e487b7160e01b5f52602260045260245ffd5b60208101610e2f828461507e565b602081525f61163b60208301846150b4565b5f6020828403121561522c575f80fd5b5051919050565b6001600160a01b0381168114610efe575f80fd5b5f60208284031215615257575f80fd5b813561163b81615233565b5f808335601e19843603018112615277575f80fd5b8301803591506001600160401b03821115615290575f80fd5b6020019150600581901b360382131561388a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152cf575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561530f5761530f6152d9565b60405290565b604080519081016001600160401b038111828210171561530f5761530f6152d9565b604051601f8201601f191681016001600160401b038111828210171561535f5761535f6152d9565b604052919050565b5f6001600160401b0382111561537f5761537f6152d9565b50601f01601f191660200190565b5f82601f83011261539c575f80fd5b81356153af6153aa82615367565b615337565b8181528460208386010111156153c3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153ef575f80fd5b6153f76152ed565b82356001600160401b038082111561540d575f80fd5b6154193683870161538d565b8352602085013591508082111561542e575f80fd5b5061543b3682860161538d565b60208301525061544d60408401614fbf565b604082015292915050565b5f82516152cf818460208701615092565b601f82111561064557805f5260205f20601f840160051c8101602085101561548e5750805b601f840160051c820191505b81811015611824575f815560010161549a565b81516001600160401b038111156154c6576154c66152d9565b6154da816154d484546151ca565b84615469565b602080601f83116001811461550d575f84156154f65750858301515b5f19600386901b1c1916600185901b178555611030565b5f85815260208120601f198616915b8281101561553b5788860151825594840194600190910190840161551c565b508582101561555857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e2f57610e2f615568565b5f63ffffffff8083168181036155a7576155a7615568565b6001019392505050565b8082028115828204841417610e2f57610e2f615568565b5f826155e257634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155fb576155fb61506a565b91905290565b5f60208083525f8454615613816151ca565b806020870152604060018084165f811461563457600181146156505761567d565b60ff19851660408a0152604084151560051b8a0101955061567d565b895f5260205f205f5b858110156156745781548b8201860152908301908801615659565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561208557612085615568565b6001600160401b0382811682821603908082111561208557612085615568565b8051611a7181614e9d565b5f80604083850312156156f6575f80fd5b82516001600160401b038082111561570c575f80fd5b908401906060828703121561571f575f80fd5b6157276152ed565b8251815260208084015161573a81615233565b8282015260408401518381111561574f575f80fd5b80850194505087601f850112615763575f80fd5b835192506157736153aa84615367565b8381528882858701011115615786575f80fd5b61579584838301848801615092565b806040840152508195506157aa8188016156da565b9450505050509250929050565b81810381811115610e2f57610e2f615568565b5f808335601e198436030181126157df575f80fd5b8301803591506001600160401b038211156157f8575f80fd5b60200191503681900382131561388a575f80fd5b5f885161581d818460208d01615092565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461589857615898615568565b505092915050565b5f8235603e198336030181126152cf575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156158f2575f80fd5b6158fa615315565b61590383614eaa565b81526020808401356001600160401b038082111561591f575f80fd5b9085019036601f830112615931575f80fd5b813581811115615943576159436152d9565b8060051b9150615954848301615337565b818152918301840191848101903684111561596d575f80fd5b938501935b83851015615997578435925061598783615233565b8282529385019390850190615972565b94860194909452509295945050505050565b5f602082840312156159b9575f80fd5b61163b82614fee565b5f602082840312156159d2575f80fd5b813560ff8116811461163b575f80fd5b5f6001600160401b038083168181036155a7576155a7615568565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a4381602a850160208b01615092565b865190830190615a5a81602a840160208b01615092565b60c087901b6001600160c01b031916602a9290910191820152615a8c603282018660e01b6001600160e01b0319169052565b615aa5603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ac8818460208801615092565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615afe818460208901615092565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b39818460208801615092565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615d91380380615d9183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c448061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614efb565b610615565b005b348015610221575f80fd5b50610214610230366004614f36565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614efb565b610858565b34801561028a575f80fd5b50610214610299366004614f4d565b610863565b3480156102a9575f80fd5b506102146102b8366004614f9b565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614f36565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614efb565b610e53565b348015610378575f80fd5b50610214610387366004614fbc565b610e5e565b348015610397575f80fd5b506102146103a6366004614fd5565b610f1f565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004615013565b61118a565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614f36565b6111c1565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614efb565b6111d5565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614f36565b611200565b348015610490575f80fd5b5061021461049f366004614fd5565b6112cb565b3480156104af575f80fd5b506102146104be366004614fbc565b6114a3565b6103f36104d136600461503d565b61162c565b3480156104e1575f80fd5b506103f35f80516020615b9883398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614f36565b611660565b34801561053a575f80fd5b506103f35f80516020615bb883398151915281565b34801561055a575f80fd5b50610214610569366004614f36565b611849565b348015610579575f80fd5b50610214610588366004615091565b611986565b6103f361059b366004614f36565b611a63565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614f36565b611a94565b604051610257919061511d565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f361061036600461519d565b611be3565b610620838383611c3e565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615c188339815191526020526040808220815160e0810190925280545f80516020615bb883398151915293929190829060ff166005811115610697576106976150a8565b60058111156106a8576106a86150a8565b81526020016001820180546106bc90615208565b80601f01602080910402602001604051908101604052809291908181526020018280546106e890615208565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6150a8565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161523a565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f45565b6040518263ffffffff1660e01b81526004016108129190615248565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061525a565b50505050565b610852838383611c3e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615bb88339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c919061525a565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b306109566060850160408601615285565b6001600160a01b031614610999576109746060840160408501615285565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856152a0565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886152a0565b8363ffffffff168181106109e0576109e06152e5565b90506020028101906109f291906152f9565b6109fb9061541d565b80516040519192505f916008880191610a1391615496565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c9190600401615248565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c91615496565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca919061525a565b90508086600801835f0151604051610ae29190615496565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646150a8565b021790555060208201516001820190610b7d90826154eb565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c229116856155ba565b8251604051919550610c3391615496565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c88906155cd565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836155ef565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611f94565b604001516120aa565b90505f610cf787612237565b90505f600282604051610d0a9190615496565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d48919061525a565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612411565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a94565b5190506002816005811115610dd757610dd76150a8565b14610df7578060405163170cc93360e21b815260040161063c919061523a565b610852838361244c565b5f805f80516020615b9883398151915260030154610e1f9084615606565b9050806001600160401b03165f03610e4d5760405163222d164360e21b81526004810184905260240161063c565b92915050565b6108528383836126c6565b610e666128b2565b5f80516020615b988339815191525f80610e7f846128e9565b91509150610e8c82612411565b610e9857505050610f06565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ec657610ec66150a8565b03610eeb575f83815260088501602052604081208054919055610ee98282612c27565b505b610f0181610efc846040015161118a565b612c85565b505050505b610f1c60015f80516020615bf883398151915255565b50565b5f8181525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b9883398151915293929190829060ff166003811115610f6c57610f6c6150a8565b6003811115610f7d57610f7d6150a8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ff382611a94565b905060018351600381111561100a5761100a6150a8565b1461102b578251604051633b0d540d60e21b815261063c9190600401615625565b600481516005811115611040576110406150a8565b036110565761104e85612cab565b505050505050565b5f8061106d61106489611f94565b60400151612e92565b509150915081841461109a57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110d35750806001600160401b03168560a001516001600160401b0316115b156110fc57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e4d906001600160401b0384166155ef565b5f6111cb82611a94565b6080015192915050565b6111e08383836126c6565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615b988339815191525f61121883611a94565b519050600481600581111561122f5761122f6150a8565b1461124f578060405163170cc93360e21b815260040161063c919061523a565b5f8381526005830160205260409020546001600160a01b0316331461129557335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c27565b6112d36128b2565b5f8181525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b9883398151915293929190829060ff166003811115611320576113206150a8565b6003811115611331576113316150a8565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113aa576113aa6150a8565b146113cb578051604051633b0d540d60e21b815261063c9190600401615625565b60046113da8260400151611a94565b5160058111156113ec576113ec6150a8565b1461147e575f6113fb85611f94565b90505f8061140c8360400151612e92565b5091509150818460400151146114385760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561147a57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148783612cab565b505061149f60015f80516020615bf883398151915255565b5050565b5f80516020615bb88339815191525f806114c86114bf85611f94565b604001516130e8565b91509150806114ee57604051632d07135360e01b8152811515600482015260240161063c565b5f8281526006840160205260409020805461150890615208565b90505f0361152c5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff166005811115611552576115526150a8565b14611585575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff169060040161523a565b5f828152600684016020526040812061159d91614e4f565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116356128b2565b611641848484346132a4565b905061165960015f80516020615bf883398151915255565b9392505050565b5f8181525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b9883398151915293929190829060ff1660038111156116ad576116ad6150a8565b60038111156116be576116be6150a8565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611737576117376150a8565b141580156117585750600381516003811115611755576117556150a8565b14155b15611779578051604051633b0d540d60e21b815261063c9190600401615625565b5f6117878260400151611a94565b905080606001516001600160401b03165f036117b9576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117e6846040015184606001518560800151611f45565b6040518263ffffffff1660e01b81526004016118029190615248565b6020604051808303815f875af115801561181e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611842919061525a565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615bb8833981519152919061189090615208565b90505f036118b45760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118da576118da6150a8565b1461190d575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff169060040161523a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611946919060040161563f565b6020604051808303815f875af1158015611962573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610645919061525a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119cf575080546001600160401b03808416911610155b156119ed5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1783613472565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a6c6128b2565b611a77823334613483565b9050611a8f60015f80516020615bf883398151915255565b919050565b611a9c614e86565b5f8281525f80516020615c18833981519152602052604090819020815160e0810190925280545f80516020615bb8833981519152929190829060ff166005811115611ae957611ae96150a8565b6005811115611afa57611afa6150a8565b8152602001600182018054611b0e90615208565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90615208565b8015611b855780601f10611b5c57610100808354040283529160200191611b85565b820191905f5260205f20905b815481529060010190602001808311611b6857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615bb8833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2690869086906156c9565b90815260200160405180910390205491505092915050565b5f8381525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b988339815191529284929091829060ff166003811115611c8c57611c8c6150a8565b6003811115611c9d57611c9d6150a8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1382611a94565b9050600283516003811115611d2a57611d2a6150a8565b14611d4b578251604051633b0d540d60e21b815261063c9190600401615625565b60208301516001600160a01b03163314611dee575f828152600585016020526040902054336001600160a01b0390911603611de8575f82815260058501602052604090205460a0820151611daf91600160b01b90046001600160401b0316906156d8565b6001600160401b0316421015611de35760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611dee565b33611270565b600281516005811115611e0357611e036150a8565b03611ee0578615611e1a57611e18828761244c565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611e53918491611e4e91906156f8565b613758565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e94846138af565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116599350505050565b600481516005811115611ef557611ef56150a8565b03611f2957611f03836138af565b5f898152600786016020526040902055611f1c88612cab565b6001945050505050611659565b805160405163170cc93360e21b815261063c919060040161523a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ff8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261201f9190810190615723565b915091508061204157604051636b2f19e960e01b815260040160405180910390fd5b815115612067578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120a3576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f81516026146120df57815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b600281101561212e576120f68160016157f5565b6121019060086155ef565b61ffff16848281518110612117576121176152e5565b016020015160f81c901b91909117906001016120e2565b5061ffff8116156121585760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156121b35761216f8160036157f5565b61217a9060086155ef565b63ffffffff168561218c8360026155ba565b8151811061219c5761219c6152e5565b016020015160f81c901b919091179060010161215b565b5063ffffffff8116156121d957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561222e576121f081601f6157f5565b6121fb9060086155ef565b866122078360066155ba565b81518110612217576122176152e5565b016020015160f81c901b91909117906001016121dc565b50949350505050565b60605f8083356020850135601461225387870160408901615285565b61226060608901896152a0565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6122e660608501856152a0565b90508110156120a357816122fd60608601866152a0565b8381811061230d5761230d6152e5565b905060200281019061231f91906152f9565b6123299080615808565b905061233860608701876152a0565b84818110612348576123486152e5565b905060200281019061235a91906152f9565b6123649080615808565b61237160608901896152a0565b86818110612381576123816152e5565b905060200281019061239391906152f9565b6123a1906020810190615808565b6123ae60608b018b6152a0565b888181106123be576123be6152e5565b90506020028101906123d091906152f9565b6123e1906060810190604001615013565b6040516020016123f7979695949392919061584a565b60408051601f1981840301815291905291506001016122d9565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612497573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124be9190810190615723565b91509150806124e057604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612523573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612547919061525a565b82511461256d578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125a9576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806125b88460400151613a4c565b915091508187146125df5760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615b98833981519152906001600160401b03908116908316111561269c575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26126bb565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b98833981519152816126df86613c3d565b90506126ea86612411565b6126f957600192505050611659565b5f8681526005830160205260409020546001600160a01b0316331461271e5733611270565b5f86815260058301602052604090205460a082015161274d91600160b01b90046001600160401b0316906156d8565b6001600160401b03168160c001516001600160401b031610156127945760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127ac576127a5878661244c565b90506127ca565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127ef9061118a565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612858573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287c919061525a565b905080846008015f8a81526020019081526020015f205f8282546128a091906155ba565b90915550501515979650505050505050565b5f80516020615bf88339815191528054600119016128e357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128f2614e86565b5f80516020615bb88339815191525f8061290e6114bf87611f94565b91509150801561293557604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612966576129666150a8565b6005811115612977576129776150a8565b815260200160018201805461298b90615208565b80601f01602080910402602001604051908101604052809291908181526020018280546129b790615208565b8015612a025780601f106129d957610100808354040283529160200191612a02565b820191905f5260205f20905b8154815290600101906020018083116129e557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a6d57612a6d6150a8565b14158015612a8e5750600181516005811115612a8b57612a8b6150a8565b14155b15612aaf57805160405163170cc93360e21b815261063c919060040161523a565b600381516005811115612ac457612ac46150a8565b03612ad25760048152612ad7565b600581525b836008018160200151604051612aed9190615496565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b3157612b316150a8565b021790555060208201516001820190612b4a90826154eb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bf057612bf06150a8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c73575f80fd5b505af115801561104e573d5f803e3d5ffd5b61149f6001600160a01b03831682613f21565b60015f80516020615bf883398151915255565b5f8181525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b9883398151915293929190829060ff166003811115612cf857612cf86150a8565b6003811115612d0957612d096150a8565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e37575f84815260058701602052604090205461271090612de990600160a01b900461ffff16856155ef565b612df39190615606565b915081866008015f8681526020019081526020015f205f828254612e1791906155ba565b90915550612e27905082846157f5565b9050612e37856020015182612c27565b612e4c8560200151610efc876060015161118a565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ec957835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612f1857612ee08160016157f5565b612eeb9060086155ef565b61ffff16868281518110612f0157612f016152e5565b016020015160f81c901b9190911790600101612ecc565b5061ffff811615612f425760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f9d57612f598160036157f5565b612f649060086155ef565b63ffffffff1687612f768360026155ba565b81518110612f8657612f866152e5565b016020015160f81c901b9190911790600101612f45565b5063ffffffff8116600314612fc557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561301a57612fdc81601f6157f5565b612fe79060086155ef565b88612ff38360066155ba565b81518110613003576130036152e5565b016020015160f81c901b9190911790600101612fc8565b505f805b6008811015613079576130328160076157f5565b61303d9060086155ef565b6001600160401b0316896130528360266155ba565b81518110613062576130626152e5565b016020015160f81c901b919091179060010161301e565b505f805b60088110156130d8576130918160076157f5565b61309c9060086155ef565b6001600160401b03168a6130b183602e6155ba565b815181106130c1576130c16152e5565b016020015160f81c901b919091179060010161307d565b5091989097509095509350505050565b5f80825160271461311e57825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561316d576131358160016157f5565b6131409060086155ef565b61ffff16858281518110613156576131566152e5565b016020015160f81c901b9190911790600101613121565b5061ffff8116156131975760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131f2576131ae8160036157f5565b6131b99060086155ef565b63ffffffff16866131cb8360026155ba565b815181106131db576131db6152e5565b016020015160f81c901b919091179060010161319a565b5063ffffffff811660021461321a57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561326f5761323181601f6157f5565b61323c9060086155ef565b876132488360066155ba565b81518110613258576132586152e5565b016020015160f81c901b919091179060010161321d565b505f86602681518110613284576132846152e5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b9883398151915290600160401b900461ffff90811690861610806132f8575061271061ffff8616115b1561331c57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613358576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b805483108061336a5750806001015483115b1561338b5760405163222d164360e21b81526004810184905260240161063c565b825f61339682610e01565b90505f6133a38983613fb4565b905060405180608001604052806133b73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61347a61452c565b610f1c81614577565b5f5f80516020615b988339815191528161349c84610e01565b90505f6134a887611a94565b90506134b387612411565b6134d3576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156134e8576134e86150a8565b1461350957805160405163170cc93360e21b815261063c919060040161523a565b5f82826080015161351a91906156d8565b905083600201600a9054906101000a90046001600160401b0316826040015161354391906158b3565b6001600160401b0316816001600160401b0316111561358057604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061358c8a84613758565b915091505f8a836040516020016135ba92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561364d5761364d6150a8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615c18833981519152602052604081206002015481905f80516020615bb883398151915290600160801b90046001600160401b03166137a085826145eb565b5f6137aa8761480e565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137fa8a858b611f45565b6040518263ffffffff1660e01b81526004016138169190615248565b6020604051808303815f875af1158015613832573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613856919061525a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b9883398151915290505f6138cf8460400151611a94565b90505f6003825160058111156138e7576138e76150a8565b14806139055750600482516005811115613903576139036150a8565b145b15613915575060c0810151613952565b60028251600581111561392a5761392a6150a8565b03613936575042613952565b815160405163170cc93360e21b815261063c919060040161523a565b84608001516001600160401b0316816001600160401b03161161397957505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061399e9061118a565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a43919061525a565b95945050505050565b5f808251602e14613a8257825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613ad157613a998160016157f5565b613aa49060086155ef565b61ffff16858281518110613aba57613aba6152e5565b016020015160f81c901b9190911790600101613a85565b5061ffff811615613afb5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b5657613b128160036157f5565b613b1d9060086155ef565b63ffffffff1686613b2f8360026155ba565b81518110613b3f57613b3f6152e5565b016020015160f81c901b9190911790600101613afe565b5063ffffffff811615613b7c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bd157613b9381601f6157f5565b613b9e9060086155ef565b87613baa8360066155ba565b81518110613bba57613bba6152e5565b016020015160f81c901b9190911790600101613b7f565b505f805b6008811015613c3057613be98160076157f5565b613bf49060086155ef565b6001600160401b031688613c098360266155ba565b81518110613c1957613c196152e5565b016020015160f81c901b9190911790600101613bd5565b5090969095509350505050565b613c45614e86565b5f8281525f80516020615c188339815191526020526040808220815160e0810190925280545f80516020615bb883398151915293929190829060ff166005811115613c9257613c926150a8565b6005811115613ca357613ca36150a8565b8152602001600182018054613cb790615208565b80601f0160208091040260200160405190810160405280929190818152602001828054613ce390615208565b8015613d2e5780601f10613d0557610100808354040283529160200191613d2e565b820191905f5260205f20905b815481529060010190602001808311613d1157829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d9c57613d9c6150a8565b14613dcf575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161523a565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e1357613e136150a8565b021790555060208201516001820190613e2c90826154eb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613eca8582613758565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f445760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f8d576040519150601f19603f3d011682016040523d82523d5f602084013e613f92565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ff857604051637fab81e560e01b815260040160405180910390fd5b5f80516020615bb8833981519152426140176060860160408701615013565b6001600160401b031611158061405157506140356202a300426155ba565b6140456060860160408701615013565b6001600160401b031610155b1561408b576140666060850160408601615013565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6140a061409b60608601866158de565b614883565b6140b061409b60808601866158de565b60306140bf6020860186615808565b9050146140f1576140d36020850185615808565b6040516326475b2f60e11b815261063c925060040190815260200190565b6140fb8480615808565b90505f036141285761410d8480615808565b604051633e08a12560e11b815260040161063c9291906158f2565b5f600882016141378680615808565b6040516141459291906156c9565b9081526020016040518091039020541461417e576141638480615808565b60405163a41f772f60e01b815260040161063c9291906158f2565b614188835f6145eb565b6040805160e08101909152815481525f90819061429490602081016141ad8980615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141f5908a018a615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161423e60608a0160408b01615013565b6001600160401b0316815260200161425960608a018a6158de565b61426290615920565b815260200161427460808a018a6158de565b61427d90615920565b8152602001876001600160401b03168152506149ec565b5f828152600686016020526040902091935091506142b282826154eb565b5081600884016142c28880615808565b6040516142d09291906156c9565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061430c908590600401615248565b6020604051808303815f875af1158015614328573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061434c919061525a565b6040805160e08101909152909150806001815260200161436c8980615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143fb576143fb6150a8565b02179055506020820151600182019061441490826154eb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144b28880615808565b6040516144c09291906156c9565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144fe9190615013565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661457557604051631afcd79f60e31b815260040160405180910390fd5b565b61457f61452c565b61458881614bd9565b614590614bf2565b610f1c606082013560808301356145ad60c0850160a08601615013565b6145bd60e0860160c087016159e7565b6145ce610100870160e08801615a00565b6101008701356145e661014089016101208a01615285565b614c02565b5f80516020615bb88339815191525f6001600160401b03808416908516111561461f5761461883856156f8565b905061462c565b61462984846156f8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061468e57506001840154815161468a916001600160401b0316906155ba565b8210155b156146b4576001600160401b0383166060820152818152604081015160208201526146d3565b82816060018181516146c691906156d8565b6001600160401b03169052505b60608101516146e39060646158b3565b602082015160018601546001600160401b03929092169161470e9190600160401b900460ff166155ef565b101561473e57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161475991906155ba565b9052506040810180516001600160401b03871691906147799083906157f5565b9052506001840154604082015160649161479e91600160401b90910460ff16906155ef565b10156147c5578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c188339815191526020526040812060020180545f80516020615bb8833981519152919060089061485890600160401b90046001600160401b0316615a20565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148906020820182614fbc565b63ffffffff161580156148b057506148ab60208201826152a0565b151590505b156148f7576148c26020820182614fbc565b6148cf60208301836152a0565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b61490460208201826152a0565b90506149136020830183614fbc565b63ffffffff16111561492c576148c26020820182614fbc565b60015b61493c60208301836152a0565b905081101561149f5761495260208301836152a0565b61495d6001846157f5565b81811061496c5761496c6152e5565b90506020020160208101906149819190615285565b6001600160a01b031661499760208401846152a0565b838181106149a7576149a76152e5565b90506020020160208101906149bc9190615285565b6001600160a01b031610156149e457604051630dbc8d5f60e31b815260040160405180910390fd5b60010161492f565b5f6060826040015151603014614a155760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a56988a986001989297929690959094909390929101615a3b565b60405160208183030381529060405290505f5b84608001516020015151811015614ac857818560800151602001518281518110614a9557614a956152e5565b6020026020010151604051602001614aae929190615af5565b60408051601f198184030181529190529150600101614a69565b5060a0840151805160209182015151604051614ae8938593929101615b2b565b60405160208183030381529060405290505f5b8460a001516020015151811015614b5a57818560a00151602001518281518110614b2757614b276152e5565b6020026020010151604051602001614b40929190615af5565b60408051601f198184030181529190529150600101614afb565b5060c0840151604051614b71918391602001615b66565b6040516020818303038152906040529050600281604051614b929190615496565b602060405180830381855afa158015614bad573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bd0919061525a565b94909350915050565b614be161452c565b614be9614d57565b610f1c81614d5f565b614bfa61452c565b614575614e47565b614c0a61452c565b5f80516020615b9883398151915261ffff85161580614c2e575061271061ffff8616115b15614c5257604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614c765760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614c895750600a60ff8516115b15614cac5760405163170db35960e31b815260ff8516600482015260240161063c565b825f03614ccc5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61457561452c565b614d6761452c565b80355f80516020615bb88339815191529081556014614d8c6060840160408501615a00565b60ff161180614dab5750614da66060830160408401615a00565b60ff16155b15614ddf57614dc06060830160408401615a00565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614def6060830160408401615a00565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e206040830160208401615013565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c9861452c565b508054614e5b90615208565b5f825580601f10614e6a575050565b601f0160209004905f5260205f2090810190610f1c9190614ec3565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ed7575f8155600101614ec4565b5090565b8015158114610f1c575f80fd5b803563ffffffff81168114611a8f575f80fd5b5f805f60608486031215614f0d575f80fd5b833592506020840135614f1f81614edb565b9150614f2d60408501614ee8565b90509250925092565b5f60208284031215614f46575f80fd5b5035919050565b5f8060408385031215614f5e575f80fd5b82356001600160401b03811115614f73575f80fd5b830160808186031215614f84575f80fd5b9150614f9260208401614ee8565b90509250929050565b5f8060408385031215614fac575f80fd5b82359150614f9260208401614ee8565b5f60208284031215614fcc575f80fd5b61165982614ee8565b5f8060408385031215614fe6575f80fd5b614fef83614ee8565b946020939093013593505050565b80356001600160401b0381168114611a8f575f80fd5b5f60208284031215615023575f80fd5b61165982614ffd565b803561ffff81168114611a8f575f80fd5b5f805f6060848603121561504f575f80fd5b83356001600160401b03811115615064575f80fd5b840160a08187031215615075575f80fd5b92506150836020850161502c565b9150614f2d60408501614ffd565b5f61014082840312156150a2575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106150cc576150cc6150a8565b9052565b5f5b838110156150ea5781810151838201526020016150d2565b50505f910152565b5f81518084526151098160208601602086016150d0565b601f01601f19169290920160200192915050565b6020815261512f6020820183516150bc565b5f602083015160e0604084015261514a6101008401826150f2565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156151ae575f80fd5b82356001600160401b03808211156151c4575f80fd5b818501915085601f8301126151d7575f80fd5b8135818111156151e5575f80fd5b8660208285010111156151f6575f80fd5b60209290920196919550909350505050565b600181811c9082168061521c57607f821691505b6020821081036150a257634e487b7160e01b5f52602260045260245ffd5b60208101610e4d82846150bc565b602081525f61165960208301846150f2565b5f6020828403121561526a575f80fd5b5051919050565b6001600160a01b0381168114610f1c575f80fd5b5f60208284031215615295575f80fd5b813561165981615271565b5f808335601e198436030181126152b5575f80fd5b8301803591506001600160401b038211156152ce575f80fd5b6020019150600581901b36038213156138a8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261530d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561534d5761534d615317565b60405290565b604080519081016001600160401b038111828210171561534d5761534d615317565b604051601f8201601f191681016001600160401b038111828210171561539d5761539d615317565b604052919050565b5f6001600160401b038211156153bd576153bd615317565b50601f01601f191660200190565b5f82601f8301126153da575f80fd5b81356153ed6153e8826153a5565b615375565b818152846020838601011115615401575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561542d575f80fd5b61543561532b565b82356001600160401b038082111561544b575f80fd5b615457368387016153cb565b8352602085013591508082111561546c575f80fd5b50615479368286016153cb565b60208301525061548b60408401614ffd565b604082015292915050565b5f825161530d8184602087016150d0565b601f82111561064557805f5260205f20601f840160051c810160208510156154cc5750805b601f840160051c820191505b81811015611842575f81556001016154d8565b81516001600160401b0381111561550457615504615317565b615518816155128454615208565b846154a7565b602080601f83116001811461554b575f84156155345750858301515b5f19600386901b1c1916600185901b17855561104e565b5f85815260208120601f198616915b828110156155795788860151825594840194600190910190840161555a565b508582101561559657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e4d57610e4d6155a6565b5f63ffffffff8083168181036155e5576155e56155a6565b6001019392505050565b8082028115828204841417610e4d57610e4d6155a6565b5f8261562057634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615639576156396150a8565b91905290565b5f60208083525f845461565181615208565b806020870152604060018084165f8114615672576001811461568e576156bb565b60ff19851660408a0152604084151560051b8a010195506156bb565b895f5260205f205f5b858110156156b25781548b8201860152908301908801615697565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120a3576120a36155a6565b6001600160401b038281168282160390808211156120a3576120a36155a6565b8051611a8f81614edb565b5f8060408385031215615734575f80fd5b82516001600160401b038082111561574a575f80fd5b908401906060828703121561575d575f80fd5b61576561532b565b8251815260208084015161577881615271565b8282015260408401518381111561578d575f80fd5b80850194505087601f8501126157a1575f80fd5b835192506157b16153e8846153a5565b83815288828587010111156157c4575f80fd5b6157d3848383018488016150d0565b806040840152508195506157e8818801615718565b9450505050509250929050565b81810381811115610e4d57610e4d6155a6565b5f808335601e1984360301811261581d575f80fd5b8301803591506001600160401b03821115615836575f80fd5b6020019150368190038213156138a8575f80fd5b5f885161585b818460208d016150d0565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146158d6576158d66155a6565b505092915050565b5f8235603e1983360301811261530d575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615930575f80fd5b615938615353565b61594183614ee8565b81526020808401356001600160401b038082111561595d575f80fd5b9085019036601f83011261596f575f80fd5b81358181111561598157615981615317565b8060051b9150615992848301615375565b81815291830184019184810190368411156159ab575f80fd5b938501935b838510156159d557843592506159c583615271565b82825293850193908501906159b0565b94860194909452509295945050505050565b5f602082840312156159f7575f80fd5b6116598261502c565b5f60208284031215615a10575f80fd5b813560ff81168114611659575f80fd5b5f6001600160401b038083168181036155e5576155e56155a6565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a8181602a850160208b016150d0565b865190830190615a9881602a840160208b016150d0565b60c087901b6001600160c01b031916602a9290910191820152615aca603282018660e01b6001600160e01b0319169052565b615ae3603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615b068184602088016150d0565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615b3c8184602089016150d0565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b778184602088016150d0565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index ddcc8252a..ef7716dbc 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -375,7 +375,11 @@ abstract contract PoSValidatorManager is * @param value Token value to convert. */ function valueToWeight(uint256 value) public view returns (uint64) { - return uint64(value / _getPoSValidatorManagerStorage()._weightToValueFactor); + uint64 weight = uint64(value / _getPoSValidatorManagerStorage()._weightToValueFactor); + if (weight == 0) { + revert InvalidStakeAmount(value); + } + return weight; } /** diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index f6adbb09b..3b34c133f 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1108,6 +1108,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _forceInitializeEndValidation(validationID, true); } + function testValueToWeightTruncated() public { + // default weightToValueFactor is 1e12 + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.InvalidStakeAmount.selector, 1e11) + ); + posValidatorManager.valueToWeight(1e11); + } + function testValueToWeight() public view { uint64 w1 = posValidatorManager.valueToWeight(1e12); uint64 w2 = posValidatorManager.valueToWeight(1e18); From 9470d4085486f3ba4854a2a6b3624143eedd60ee Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 21 Oct 2024 14:03:07 -0500 Subject: [PATCH 20/35] readme note on weightToValue factor --- contracts/validator-manager/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index b618b0402..765b5401a 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -58,6 +58,11 @@ Proof-of-Authority Validator management is provided via `PoAValidatorManager`, w Proof-of-Stake Validator management is provided by the abstract contract `PoSValidatorManager`, which has two concrete implementations: `NativeTokenStakingManager` and `ERC20TokenStakingManager`. In addition to basic Validator management provided in `ValidatorManager`, `PoSValidatorManager` supports uptime-based Validation rewards, as well as Delegation to a Validator. This [state transition diagram](./StateTransition.md) illustrates the relationship between Validators and Delegators. +> [!NOTE] +> The `weightToValueFactor` fields of the `PoSValidatorManagerSettings` passed to `PoSValidatorManager`'s `initialize` function sets the factor used to convert between the value transferred to the contract as stake, and the weight that the Validator is registered with on the P-Chain. This involves integer division, which may result in loss of precision. When selecting `weightToValueFactor`, it's important to make the following considerations: +> 1. If `weightToValueFactor` is near the denomination of the asset, then staking amounts on the order of 1 unit of the asset may cause the converted weight to round down to 0. This may impose a larger-than-expected minimum stake amount. +> 2. Staked amounts up to `weightValueFactor - 1` may be lost in the contract as dust, as the Validator's registered weight is used to calculate the original staked amount. + #### NativeTokenStakingManager `NativeTokenStakingManager` allows permissionless addition and removal of Validators that post the Subnet's native token as stake. Staking rewards are minted via the Native Minter Precompile, which is configured with a set of addresses with minting privileges. As such, the address that `NativeTokenStakingManager` is deployed to must be added as an admin to the precompile. This can be done by either calling the precompile's `setAdmin` method from an admin address, or setting the address in the Native Minter precompile settings in the chain's genesis (`config.contractNativeMinterConfig.adminAddresses`). There are a couple of methods to get this address: one is to calculate the resulting deployed address based on the deployer's address and account nonce: `keccak256(rlp.encode(address, nonce))`. The second method involves manually placing the `NativeTokenStakingManager` bytecode at a particular address in the genesis, then setting that address as an admin. From 8c8b2f2630cf6e366c263a38c2da841d70bb9fd1 Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:32:59 -0500 Subject: [PATCH 21/35] Update contracts/validator-manager/README.md Co-authored-by: Michael Kaplan <55204436+michaelkaplan13@users.noreply.github.com> Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- contracts/validator-manager/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 765b5401a..1c22694f4 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -59,7 +59,7 @@ Proof-of-Authority Validator management is provided via `PoAValidatorManager`, w Proof-of-Stake Validator management is provided by the abstract contract `PoSValidatorManager`, which has two concrete implementations: `NativeTokenStakingManager` and `ERC20TokenStakingManager`. In addition to basic Validator management provided in `ValidatorManager`, `PoSValidatorManager` supports uptime-based Validation rewards, as well as Delegation to a Validator. This [state transition diagram](./StateTransition.md) illustrates the relationship between Validators and Delegators. > [!NOTE] -> The `weightToValueFactor` fields of the `PoSValidatorManagerSettings` passed to `PoSValidatorManager`'s `initialize` function sets the factor used to convert between the value transferred to the contract as stake, and the weight that the Validator is registered with on the P-Chain. This involves integer division, which may result in loss of precision. When selecting `weightToValueFactor`, it's important to make the following considerations: +> The `weightToValueFactor` fields of the `PoSValidatorManagerSettings` passed to `PoSValidatorManager`'s `initialize` function sets the factor used to convert between the weight that the Validator is registered with on the P-Chain, and the value transferred to the contract as stake. This involves integer division, which may result in loss of precision. When selecting `weightToValueFactor`, it's important to make the following considerations: > 1. If `weightToValueFactor` is near the denomination of the asset, then staking amounts on the order of 1 unit of the asset may cause the converted weight to round down to 0. This may impose a larger-than-expected minimum stake amount. > 2. Staked amounts up to `weightValueFactor - 1` may be lost in the contract as dust, as the Validator's registered weight is used to calculate the original staked amount. From de060a04e904f3299008f2b8283e29391a0f701e Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 22 Oct 2024 09:40:15 -0500 Subject: [PATCH 22/35] disallow weight > uint64max --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 6 +++--- contracts/validator-manager/README.md | 1 + .../tests/PoSValidatorManagerTests.t.sol | 8 ++++++++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index e2808e323..ffad36c9d 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161608638038061608683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f398061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615157565b6104b3565b005b610214610224366004615192565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615157565b6106f6565b6102146102693660046151a9565b610701565b61021461027c3660046151f7565b610c2b565b61029461028f366004615192565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615157565b610cf1565b6102146102e9366004615218565b610cfc565b6103016102fc366004615258565b610dbd565b60405190815260200161023f565b61021461031d3660046152bd565b610df2565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d3660046152e5565b61105d565b610294610360366004615192565b611094565b6103015f81565b61021461037a366004615157565b6110a8565b610231603081565b610214610395366004615192565b6110d3565b6102146103a83660046152bd565b61119e565b6103016103bb3660046152fe565b611376565b6102146103ce366004615218565b6113a2565b6103015f80516020615e8d83398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b366004615192565b61152b565b6103015f80516020615ead83398151915281565b610214610442366004615192565b611714565b610231601481565b61046261045d366004615192565b611851565b60405161023f9190615393565b6102946202a30081565b6103015f80516020615e6d83398151915281565b61021461049b366004615427565b6119a0565b6103016104ae366004615465565b611a7f565b6104be838383611ada565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615f0d8339815191526020526040808220815160e0810190925280545f80516020615ead83398151915293929190829060ff1660058111156105355761053561531e565b60058111156105465761054661531e565b815260200160018201805461055a906154d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906154d0565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c61531e565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615508565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611de8565b6040518263ffffffff1660e01b81526004016106b09190615516565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f09190615528565b50505050565b6106f0838383611ada565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615ead8339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190615528565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f4606085016040860161553f565b6001600160a01b03161461083757610812606084016040850161553f565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f610845606085018561555a565b905090505f805b828163ffffffff161015610b2d575f610868606088018861555a565b8363ffffffff1681811061087e5761087e61559f565b905060200281019061089091906155b3565b610899906156d7565b80516040519192505f9160088801916108b191615750565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da9190600401615516565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615750565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109689190615528565b90508086600801835f01516040516109809190615750565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a0261531e565b021790555060208201516001820190610a1b90826157a5565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac0911685615874565b8251604051919550610ad191615750565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615887565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836158a9565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e37565b60400151611f4d565b90505f610b95876120da565b90505f600282604051610ba89190615750565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be69190615528565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c34826122b4565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611851565b5190506002816005811115610c7557610c7561531e565b14610c95578060405163170cc93360e21b81526004016104da9190615508565b6106f083836122ef565b5f805f80516020615e8d83398151915260030154610cbd90846158c0565b9050806001600160401b03165f03610ceb5760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f0838383612569565b610d04612755565b5f80516020615e8d8339815191525f80610d1d8461278c565b91509150610d2a826122b4565b610d3657505050610da4565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6457610d6461531e565b03610d89575f83815260088501602052604081208054919055610d878282612aca565b505b610d9f81610d9a846040015161105d565b612b40565b505050505b610dba60015f80516020615eed83398151915255565b50565b5f610dc6612755565b610dd285858585612b76565b9050610dea60015f80516020615eed83398151915255565b949350505050565b5f8181525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d83398151915293929190829060ff166003811115610e3f57610e3f61531e565b6003811115610e5057610e5061531e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ec682611851565b9050600183516003811115610edd57610edd61531e565b14610efe578251604051633b0d540d60e21b81526104da91906004016158df565b600481516005811115610f1357610f1361531e565b03610f2957610f2185612d4f565b505050505050565b5f80610f40610f3789611e37565b60400151612f36565b5091509150818414610f6d57846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fa65750806001600160401b03168560a001516001600160401b0316115b15610fcf57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610ceb906001600160401b0384166158a9565b5f61109e82611851565b6080015192915050565b6110b3838383612569565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615e8d8339815191525f6110eb83611851565b51905060048160058111156111025761110261531e565b14611122578060405163170cc93360e21b81526004016104da9190615508565b5f8381526005830160205260409020546001600160a01b0316331461116857335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612aca565b6111a6612755565b5f8181525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d83398151915293929190829060ff1660038111156111f3576111f361531e565b60038111156112045761120461531e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561127d5761127d61531e565b1461129e578051604051633b0d540d60e21b81526104da91906004016158df565b60046112ad8260400151611851565b5160058111156112bf576112bf61531e565b14611351575f6112ce85611e37565b90505f806112df8360400151612f36565b50915091508184604001511461130b5760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561134d57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61135a83612d4f565b505061137260015f80516020615eed83398151915255565b5050565b5f61137f612755565b61138a83338461318c565b9050610ceb60015f80516020615eed83398151915255565b5f80516020615ead8339815191525f806113c76113be85611e37565b60400151613464565b91509150806113ed57604051632d07135360e01b815281151560048201526024016104da565b5f82815260068401602052604090208054611407906154d0565b90505f0361142b5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff1660058111156114515761145161531e565b14611484575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615508565b5f828152600684016020526040812061149c916150a6565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d83398151915293929190829060ff1660038111156115785761157861531e565b60038111156115895761158961531e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116025761160261531e565b1415801561162357506003815160038111156116205761162061531e565b14155b15611644578051604051633b0d540d60e21b81526104da91906004016158df565b5f6116528260400151611851565b905080606001516001600160401b03165f03611684576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b1846040015184606001518560800151611de8565b6040518263ffffffff1660e01b81526004016116cd9190615516565b6020604051808303815f875af11580156116e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170d9190615528565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615ead833981519152919061175b906154d0565b90505f0361177f5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117a5576117a561531e565b146117d8575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615508565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161181191906004016158f9565b6020604051808303815f875af115801561182d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190615528565b6118596150dd565b5f8281525f80516020615f0d833981519152602052604090819020815160e0810190925280545f80516020615ead833981519152929190829060ff1660058111156118a6576118a661531e565b60058111156118b7576118b761531e565b81526020016001820180546118cb906154d0565b80601f01602080910402602001604051908101604052809291908181526020018280546118f7906154d0565b80156119425780601f1061191957610100808354040283529160200191611942565b820191905f5260205f20905b81548152906001019060200180831161192557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119e9575080546001600160401b03808416911610155b15611a075760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a328484613620565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615ead833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611ac29086908690615983565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d8339815191529284929091829060ff166003811115611b2857611b2861531e565b6003811115611b3957611b3961531e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611baf82611851565b9050600283516003811115611bc657611bc661531e565b14611be7578251604051633b0d540d60e21b81526104da91906004016158df565b60208301516001600160a01b03163314611c8a575f828152600585016020526040902054336001600160a01b0390911603611c84575f82815260058501602052604090205460a0820151611c4b91600160b01b90046001600160401b031690615992565b6001600160401b0316421015611c7f5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611c8a565b33611143565b600281516005811115611c9f57611c9f61531e565b03611d7c578615611cb657611cb482876122ef565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611cef918491611cea91906159b2565b61363a565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d3084613791565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611de19350505050565b600481516005811115611d9157611d9161531e565b03611dc557611d9f83613791565b5f898152600786016020526040902055611db888612d4f565b6001945050505050611de1565b805160405163170cc93360e21b81526104da9190600401615508565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e9b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ec291908101906159dd565b9150915080611ee457604051636b2f19e960e01b815260040160405180910390fd5b815115611f0a578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f46576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611f8257815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b6002811015611fd157611f99816001615aaf565b611fa49060086158a9565b61ffff16848281518110611fba57611fba61559f565b016020015160f81c901b9190911790600101611f85565b5061ffff811615611ffb5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561205657612012816003615aaf565b61201d9060086158a9565b63ffffffff168561202f836002615874565b8151811061203f5761203f61559f565b016020015160f81c901b9190911790600101611ffe565b5063ffffffff81161561207c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120d15761209381601f615aaf565b61209e9060086158a9565b866120aa836006615874565b815181106120ba576120ba61559f565b016020015160f81c901b919091179060010161207f565b50949350505050565b60605f808335602085013560146120f68787016040890161553f565b612103606089018961555a565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b612189606085018561555a565b9050811015611f4657816121a0606086018661555a565b838181106121b0576121b061559f565b90506020028101906121c291906155b3565b6121cc9080615ac2565b90506121db606087018761555a565b848181106121eb576121eb61559f565b90506020028101906121fd91906155b3565b6122079080615ac2565b612214606089018961555a565b868181106122245761222461559f565b905060200281019061223691906155b3565b612244906020810190615ac2565b61225160608b018b61555a565b888181106122615761226161559f565b905060200281019061227391906155b3565b6122849060608101906040016152e5565b60405160200161229a9796959493929190615b04565b60408051601f19818403018152919052915060010161217c565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561233a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261236191908101906159dd565b915091508061238357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ea9190615528565b825114612410578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561244c576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061245b846040015161392e565b915091508187146124825760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615e8d833981519152906001600160401b03908116908316111561253f575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261255e565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e8d8339815191528161258286613b1f565b905061258d866122b4565b61259c57600192505050611de1565b5f8681526005830160205260409020546001600160a01b031633146125c15733611143565b5f86815260058301602052604090205460a08201516125f091600160b01b90046001600160401b031690615992565b6001600160401b03168160c001516001600160401b031610156126375760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f851561264f5761264887866122ef565b905061266d565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126929061105d565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156126fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271f9190615528565b905080846008015f8a81526020019081526020015f205f8282546127439190615874565b90915550501515979650505050505050565b5f80516020615eed83398151915280546001190161278657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127956150dd565b5f80516020615ead8339815191525f806127b16113be87611e37565b9150915080156127d857604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128095761280961531e565b600581111561281a5761281a61531e565b815260200160018201805461282e906154d0565b80601f016020809104026020016040519081016040528092919081815260200182805461285a906154d0565b80156128a55780601f1061287c576101008083540402835291602001916128a5565b820191905f5260205f20905b81548152906001019060200180831161288857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129105761291061531e565b14158015612931575060018151600581111561292e5761292e61531e565b14155b1561295257805160405163170cc93360e21b81526104da9190600401615508565b6003815160058111156129675761296761531e565b03612975576004815261297a565b600581525b8360080181602001516040516129909190615750565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156129d4576129d461531e565b0217905550602082015160018201906129ed90826157a5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a9357612a9361531e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e6d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b25575f80fd5b505af1158015612b37573d5f803e3d5ffd5b50505050505050565b5f80516020615e6d83398151915254611372906001600160a01b03168383613e03565b60015f80516020615eed83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e8d83398151915290600160401b900461ffff9081169086161080612bca575061271061ffff8616115b15612bee57604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c2a576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c3c5750806001015483115b15612c5d5760405163222d164360e21b8152600481018490526024016104da565b5f612c6784613e62565b90505f612c7382610c9f565b90505f612c808983613e85565b90506040518060800160405280612c943390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ecd8339815191526020526040808220815160e0810190925280545f80516020615e8d83398151915293929190829060ff166003811115612d9c57612d9c61531e565b6003811115612dad57612dad61531e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612edb575f84815260058701602052604090205461271090612e8d90600160a01b900461ffff16856158a9565b612e9791906158c0565b915081866008015f8681526020019081526020015f205f828254612ebb9190615874565b90915550612ecb90508284615aaf565b9050612edb856020015182612aca565b612ef08560200151610d9a876060015161105d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f6d57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612fbc57612f84816001615aaf565b612f8f9060086158a9565b61ffff16868281518110612fa557612fa561559f565b016020015160f81c901b9190911790600101612f70565b5061ffff811615612fe65760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561304157612ffd816003615aaf565b6130089060086158a9565b63ffffffff168761301a836002615874565b8151811061302a5761302a61559f565b016020015160f81c901b9190911790600101612fe9565b5063ffffffff811660031461306957604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130be5761308081601f615aaf565b61308b9060086158a9565b88613097836006615874565b815181106130a7576130a761559f565b016020015160f81c901b919091179060010161306c565b505f805b600881101561311d576130d6816007615aaf565b6130e19060086158a9565b6001600160401b0316896130f6836026615874565b815181106131065761310661559f565b016020015160f81c901b91909117906001016130c2565b505f805b600881101561317c57613135816007615aaf565b6131409060086158a9565b6001600160401b03168a61315583602e615874565b815181106131655761316561559f565b016020015160f81c901b9190911790600101613121565b5091989097509095509350505050565b5f5f80516020615e8d833981519152816131a861028f85613e62565b90505f6131b487611851565b90506131bf876122b4565b6131df576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156131f4576131f461531e565b1461321557805160405163170cc93360e21b81526104da9190600401615508565b5f8282608001516132269190615992565b905083600201600a9054906101000a90046001600160401b0316826040015161324f9190615b6d565b6001600160401b0316816001600160401b0316111561328c57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132988a8461363a565b915091505f8a836040516020016132c692919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156133595761335961531e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461349a57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156134e9576134b1816001615aaf565b6134bc9060086158a9565b61ffff168582815181106134d2576134d261559f565b016020015160f81c901b919091179060010161349d565b5061ffff8116156135135760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561356e5761352a816003615aaf565b6135359060086158a9565b63ffffffff1686613547836002615874565b815181106135575761355761559f565b016020015160f81c901b9190911790600101613516565b5063ffffffff811660021461359657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135eb576135ad81601f615aaf565b6135b89060086158a9565b876135c4836006615874565b815181106135d4576135d461559f565b016020015160f81c901b9190911790600101613599565b505f866026815181106136005761360061559f565b016020015191976001600160f81b03199092161515965090945050505050565b6136286143fd565b61363182614448565b611372816144bc565b5f8281525f80516020615f0d833981519152602052604081206002015481905f80516020615ead83398151915290600160801b90046001600160401b03166136828582614524565b5f61368c87614747565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136dc8a858b611de8565b6040518263ffffffff1660e01b81526004016136f89190615516565b6020604051808303815f875af1158015613714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137389190615528565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e8d83398151915290505f6137b18460400151611851565b90505f6003825160058111156137c9576137c961531e565b14806137e757506004825160058111156137e5576137e561531e565b145b156137f7575060c0810151613834565b60028251600581111561380c5761380c61531e565b03613818575042613834565b815160405163170cc93360e21b81526104da9190600401615508565b84608001516001600160401b0316816001600160401b03161161385b57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138809061105d565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613901573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139259190615528565b95945050505050565b5f808251602e1461396457825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b60028110156139b35761397b816001615aaf565b6139869060086158a9565b61ffff1685828151811061399c5761399c61559f565b016020015160f81c901b9190911790600101613967565b5061ffff8116156139dd5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a38576139f4816003615aaf565b6139ff9060086158a9565b63ffffffff1686613a11836002615874565b81518110613a2157613a2161559f565b016020015160f81c901b91909117906001016139e0565b5063ffffffff811615613a5e57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613ab357613a7581601f615aaf565b613a809060086158a9565b87613a8c836006615874565b81518110613a9c57613a9c61559f565b016020015160f81c901b9190911790600101613a61565b505f805b6008811015613b1257613acb816007615aaf565b613ad69060086158a9565b6001600160401b031688613aeb836026615874565b81518110613afb57613afb61559f565b016020015160f81c901b9190911790600101613ab7565b5090969095509350505050565b613b276150dd565b5f8281525f80516020615f0d8339815191526020526040808220815160e0810190925280545f80516020615ead83398151915293929190829060ff166005811115613b7457613b7461531e565b6005811115613b8557613b8561531e565b8152602001600182018054613b99906154d0565b80601f0160208091040260200160405190810160405280929190818152602001828054613bc5906154d0565b8015613c105780601f10613be757610100808354040283529160200191613c10565b820191905f5260205f20905b815481529060010190602001808311613bf357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c7e57613c7e61531e565b14613cb1575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615508565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cf557613cf561531e565b021790555060208201516001820190613d0e90826157a5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613dac858261363a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506147bc565b5f610ceb825f80516020615e6d833981519152546001600160a01b03169061481d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ec957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ead83398151915242613ee860608601604087016152e5565b6001600160401b0316111580613f225750613f066202a30042615874565b613f1660608601604087016152e5565b6001600160401b031610155b15613f5c57613f3760608501604086016152e5565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f71613f6c6060860186615b98565b614976565b613f81613f6c6080860186615b98565b6030613f906020860186615ac2565b905014613fc257613fa46020850185615ac2565b6040516326475b2f60e11b81526104da925060040190815260200190565b613fcc8480615ac2565b90505f03613ff957613fde8480615ac2565b604051633e08a12560e11b81526004016104da929190615bac565b5f600882016140088680615ac2565b604051614016929190615983565b9081526020016040518091039020541461404f576140348480615ac2565b60405163a41f772f60e01b81526004016104da929190615bac565b614059835f614524565b6040805160e08101909152815481525f908190614165906020810161407e8980615ac2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906140c6908a018a615ac2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161410f60608a0160408b016152e5565b6001600160401b0316815260200161412a60608a018a615b98565b61413390615bda565b815260200161414560808a018a615b98565b61414e90615bda565b8152602001876001600160401b0316815250614adf565b5f8281526006860160205260409020919350915061418382826157a5565b5081600884016141938880615ac2565b6040516141a1929190615983565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141dd908590600401615516565b6020604051808303815f875af11580156141f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061421d9190615528565b6040805160e08101909152909150806001815260200161423d8980615ac2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156142cc576142cc61531e565b0217905550602082015160018201906142e590826157a5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143838880615ac2565b604051614391929190615983565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906143cf91906152e5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661444657604051631afcd79f60e31b815260040160405180910390fd5b565b6144506143fd565b61445981614ccc565b614461614ce5565b610dba6060820135608083013561447e60c0850160a086016152e5565b61448e60e0860160c08701615ca1565b61449f610100870160e08801615cba565b6101008701356144b761014089016101208a0161553f565b614cf5565b6144c46143fd565b5f80516020615e6d8339815191526001600160a01b03821661450457604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615ead8339815191525f6001600160401b0380841690851611156145585761455183856159b2565b9050614565565b61456284846159b2565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145c75750600184015481516145c3916001600160401b031690615874565b8210155b156145ed576001600160401b03831660608201528181526040810151602082015261460c565b82816060018181516145ff9190615992565b6001600160401b03169052505b606081015161461c906064615b6d565b602082015160018601546001600160401b0392909216916146479190600160401b900460ff166158a9565b101561467757606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146929190615874565b9052506040810180516001600160401b03871691906146b2908390615aaf565b905250600184015460408201516064916146d791600160401b90910460ff16906158a9565b10156146fe578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f0d8339815191526020526040812060020180545f80516020615ead833981519152919060089061479190600160401b90046001600160401b0316615cda565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147d06001600160a01b03841683614e4a565b905080515f141580156147f45750808060200190518101906147f29190615cf5565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614863573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148879190615528565b905061489e6001600160a01b038516333086614e57565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156148e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149069190615528565b905081811161496c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139258282615aaf565b6149836020820182615218565b63ffffffff161580156149a3575061499e602082018261555a565b151590505b156149ea576149b56020820182615218565b6149c2602083018361555a565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b6149f7602082018261555a565b9050614a066020830183615218565b63ffffffff161115614a1f576149b56020820182615218565b60015b614a2f602083018361555a565b905081101561137257614a45602083018361555a565b614a50600184615aaf565b818110614a5f57614a5f61559f565b9050602002016020810190614a74919061553f565b6001600160a01b0316614a8a602084018461555a565b83818110614a9a57614a9a61559f565b9050602002016020810190614aaf919061553f565b6001600160a01b03161015614ad757604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a22565b5f6060826040015151603014614b085760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b49988a986001989297929690959094909390929101615d10565b60405160208183030381529060405290505f5b84608001516020015151811015614bbb57818560800151602001518281518110614b8857614b8861559f565b6020026020010151604051602001614ba1929190615dca565b60408051601f198184030181529190529150600101614b5c565b5060a0840151805160209182015151604051614bdb938593929101615e00565b60405160208183030381529060405290505f5b8460a001516020015151811015614c4d57818560a00151602001518281518110614c1a57614c1a61559f565b6020026020010151604051602001614c33929190615dca565b60408051601f198184030181529190529150600101614bee565b5060c0840151604051614c64918391602001615e3b565b6040516020818303038152906040529050600281604051614c859190615750565b602060405180830381855afa158015614ca0573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614cc39190615528565b94909350915050565b614cd46143fd565b614cdc614e90565b610dba81614e98565b614ced6143fd565b614446614f80565b614cfd6143fd565b5f80516020615e8d83398151915261ffff85161580614d21575061271061ffff8616115b15614d4557604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614d695760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614d7c5750600a60ff8516115b15614d9f5760405163170db35960e31b815260ff851660048201526024016104da565b825f03614dbf5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611de183835f614f88565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e30565b6144466143fd565b614ea06143fd565b80355f80516020615ead8339815191529081556014614ec56060840160408501615cba565b60ff161180614ee45750614edf6060830160408401615cba565b60ff16155b15614f1857614ef96060830160408401615cba565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614f286060830160408401615cba565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f5960408301602084016152e5565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b636143fd565b606081471015614fad5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614fc89190615750565b5f6040518083038185875af1925050503d805f8114615002576040519150601f19603f3d011682016040523d82523d5f602084013e615007565b606091505b5091509150615017868383615021565b9695505050505050565b606082615036576150318261507d565b611de1565b815115801561504d57506001600160a01b0384163b155b1561507657604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611de1565b80511561508d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546150b2906154d0565b5f825580601f106150c1575050565b601f0160209004905f5260205f2090810190610dba919061511a565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b8082111561512e575f815560010161511b565b5090565b8015158114610dba575f80fd5b803563ffffffff81168114615152575f80fd5b919050565b5f805f60608486031215615169575f80fd5b83359250602084013561517b81615132565b91506151896040850161513f565b90509250925092565b5f602082840312156151a2575f80fd5b5035919050565b5f80604083850312156151ba575f80fd5b82356001600160401b038111156151cf575f80fd5b8301608081860312156151e0575f80fd5b91506151ee6020840161513f565b90509250929050565b5f8060408385031215615208575f80fd5b823591506151ee6020840161513f565b5f60208284031215615228575f80fd5b611de18261513f565b803561ffff81168114615152575f80fd5b80356001600160401b0381168114615152575f80fd5b5f805f806080858703121561526b575f80fd5b84356001600160401b03811115615280575f80fd5b850160a08188031215615291575f80fd5b935061529f60208601615231565b92506152ad60408601615242565b9396929550929360600135925050565b5f80604083850312156152ce575f80fd5b6152d78361513f565b946020939093013593505050565b5f602082840312156152f5575f80fd5b611de182615242565b5f806040838503121561530f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106153425761534261531e565b9052565b5f5b83811015615360578181015183820152602001615348565b50505f910152565b5f815180845261537f816020860160208601615346565b601f01601f19169290920160200192915050565b602081526153a5602082018351615332565b5f602083015160e060408401526153c0610100840182615368565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dba575f80fd5b5f8082840361016081121561543a575f80fd5b61014080821215615449575f80fd5b849350830135905061545a81615413565b809150509250929050565b5f8060208385031215615476575f80fd5b82356001600160401b038082111561548c575f80fd5b818501915085601f83011261549f575f80fd5b8135818111156154ad575f80fd5b8660208285010111156154be575f80fd5b60209290920196919550909350505050565b600181811c908216806154e457607f821691505b60208210810361550257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ceb8284615332565b602081525f611de16020830184615368565b5f60208284031215615538575f80fd5b5051919050565b5f6020828403121561554f575f80fd5b8135611de181615413565b5f808335601e1984360301811261556f575f80fd5b8301803591506001600160401b03821115615588575f80fd5b6020019150600581901b360382131561378a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155c7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615607576156076155d1565b60405290565b604080519081016001600160401b0381118282101715615607576156076155d1565b604051601f8201601f191681016001600160401b0381118282101715615657576156576155d1565b604052919050565b5f6001600160401b03821115615677576156776155d1565b50601f01601f191660200190565b5f82601f830112615694575f80fd5b81356156a76156a28261565f565b61562f565b8181528460208386010111156156bb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156156e7575f80fd5b6156ef6155e5565b82356001600160401b0380821115615705575f80fd5b61571136838701615685565b83526020850135915080821115615726575f80fd5b5061573336828601615685565b60208301525061574560408401615242565b604082015292915050565b5f82516155c7818460208701615346565b601f8211156104e357805f5260205f20601f840160051c810160208510156157865750805b601f840160051c820191505b8181101561170d575f8155600101615792565b81516001600160401b038111156157be576157be6155d1565b6157d2816157cc84546154d0565b84615761565b602080601f831160018114615805575f84156157ee5750858301515b5f19600386901b1c1916600185901b178555610f21565b5f85815260208120601f198616915b8281101561583357888601518255948401946001909101908401615814565b508582101561585057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ceb57610ceb615860565b5f63ffffffff80831681810361589f5761589f615860565b6001019392505050565b8082028115828204841417610ceb57610ceb615860565b5f826158da57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106158f3576158f361531e565b91905290565b5f60208083525f845461590b816154d0565b806020870152604060018084165f811461592c576001811461594857615975565b60ff19851660408a0152604084151560051b8a01019550615975565b895f5260205f205f5b8581101561596c5781548b8201860152908301908801615951565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f4657611f46615860565b6001600160401b03828116828216039080821115611f4657611f46615860565b805161515281615132565b5f80604083850312156159ee575f80fd5b82516001600160401b0380821115615a04575f80fd5b9084019060608287031215615a17575f80fd5b615a1f6155e5565b82518152602080840151615a3281615413565b82820152604084015183811115615a47575f80fd5b80850194505087601f850112615a5b575f80fd5b83519250615a6b6156a28461565f565b8381528882858701011115615a7e575f80fd5b615a8d84838301848801615346565b80604084015250819550615aa28188016159d2565b9450505050509250929050565b81810381811115610ceb57610ceb615860565b5f808335601e19843603018112615ad7575f80fd5b8301803591506001600160401b03821115615af0575f80fd5b60200191503681900382131561378a575f80fd5b5f8851615b15818460208d01615346565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b9057615b90615860565b505092915050565b5f8235603e198336030181126155c7575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615bea575f80fd5b615bf261560d565b615bfb8361513f565b81526020808401356001600160401b0380821115615c17575f80fd5b9085019036601f830112615c29575f80fd5b813581811115615c3b57615c3b6155d1565b8060051b9150615c4c84830161562f565b8181529183018401918481019036841115615c65575f80fd5b938501935b83851015615c8f5784359250615c7f83615413565b8282529385019390850190615c6a565b94860194909452509295945050505050565b5f60208284031215615cb1575f80fd5b611de182615231565b5f60208284031215615cca575f80fd5b813560ff81168114611de1575f80fd5b5f6001600160401b0380831681810361589f5761589f615860565b5f60208284031215615d05575f80fd5b8151611de181615132565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d5681602a850160208b01615346565b865190830190615d6d81602a840160208b01615346565b60c087901b6001600160c01b031916602a9290910191820152615d9f603282018660e01b6001600160e01b0319169052565b615db8603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ddb818460208801615346565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615e11818460208901615346565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e4c818460208801615346565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161608e38038061608e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f418061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f36600461515f565b6104b3565b005b61021461022436600461519a565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b61021461025636600461515f565b6106f6565b6102146102693660046151b1565b610701565b61021461027c3660046151ff565b610c2b565b61029461028f36600461519a565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d636600461515f565b610cf9565b6102146102e9366004615220565b610d04565b6103016102fc366004615260565b610dc5565b60405190815260200161023f565b61021461031d3660046152c5565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d3660046152ed565b611065565b61029461036036600461519a565b61109c565b6103015f81565b61021461037a36600461515f565b6110b0565b610231603081565b61021461039536600461519a565b6110db565b6102146103a83660046152c5565b6111a6565b6103016103bb366004615306565b61137e565b6102146103ce366004615220565b6113aa565b6103015f80516020615e9583398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b36600461519a565b611533565b6103015f80516020615eb583398151915281565b61021461044236600461519a565b61171c565b610231601481565b61046261045d36600461519a565b611859565b60405161023f919061539b565b6102946202a30081565b6103015f80516020615e7583398151915281565b61021461049b36600461542f565b6119a8565b6103016104ae36600461546d565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615f158339815191526020526040808220815160e0810190925280545f80516020615eb583398151915293929190829060ff16600581111561053557610535615326565b600581111561054657610546615326565b815260200160018201805461055a906154d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906154d8565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615326565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615510565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611df0565b6040518263ffffffff1660e01b81526004016106b0919061551e565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f09190615530565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615eb58339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190615530565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615547565b6001600160a01b031614610837576108126060840160408501615547565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615562565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615562565b8363ffffffff1681811061087e5761087e6155a7565b905060200281019061089091906155bb565b610899906156df565b80516040519192505f9160088801916108b191615758565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da919060040161551e565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615758565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109689190615530565b90508086600801835f01516040516109809190615758565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615326565b021790555060208201516001820190610a1b90826157ad565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561587c565b8251604051919550610ad191615758565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b269061588f565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836158b1565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e3f565b60400151611f55565b90505f610b95876120e2565b90505f600282604051610ba89190615758565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be69190615530565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c34826122bc565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c75615326565b14610c95578060405163170cc93360e21b81526004016104da9190615510565b6106f083836122f7565b5f805f80516020615e9583398151915260030154610cbd90846158c8565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f0838383612571565b610d0c61275d565b5f80516020615e958339815191525f80610d2584612794565b91509150610d32826122bc565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c615326565b03610d91575f83815260088501602052604081208054919055610d8f8282612ad2565b505b610da781610da28460400151611065565b612b48565b505050505b610dc260015f80516020615ef583398151915255565b50565b5f610dce61275d565b610dda85858585612b7e565b9050610df260015f80516020615ef583398151915255565b949350505050565b5f8181525f80516020615ed58339815191526020526040808220815160e0810190925280545f80516020615e9583398151915293929190829060ff166003811115610e4757610e47615326565b6003811115610e5857610e58615326565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee5615326565b14610f06578251604051633b0d540d60e21b81526104da91906004016158e7565b600481516005811115610f1b57610f1b615326565b03610f3157610f2985612d57565b505050505050565b5f80610f48610f3f89611e3f565b60400151612f3e565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b0384166158b1565b5f6110a682611859565b6080015192915050565b6110bb838383612571565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615e958339815191525f6110f383611859565b519050600481600581111561110a5761110a615326565b1461112a578060405163170cc93360e21b81526004016104da9190615510565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612ad2565b6111ae61275d565b5f8181525f80516020615ed58339815191526020526040808220815160e0810190925280545f80516020615e9583398151915293929190829060ff1660038111156111fb576111fb615326565b600381111561120c5761120c615326565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128557611285615326565b146112a6578051604051633b0d540d60e21b81526104da91906004016158e7565b60046112b58260400151611859565b5160058111156112c7576112c7615326565b14611359575f6112d685611e3f565b90505f806112e78360400151612f3e565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612d57565b505061137a60015f80516020615ef583398151915255565b5050565b5f61138761275d565b611392833384613194565b9050610cf360015f80516020615ef583398151915255565b5f80516020615eb58339815191525f806113cf6113c685611e3f565b6040015161346c565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f906154d8565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff16600581111561145957611459615326565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615510565b5f82815260068401602052604081206114a4916150ae565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ed58339815191526020526040808220815160e0810190925280545f80516020615e9583398151915293929190829060ff16600381111561158057611580615326565b600381111561159157611591615326565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a615326565b1415801561162b575060038151600381111561162857611628615326565b14155b1561164c578051604051633b0d540d60e21b81526104da91906004016158e7565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611df0565b6040518263ffffffff1660e01b81526004016116d5919061551e565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117159190615530565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615eb58339815191529190611763906154d8565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad615326565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615510565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118199190600401615901565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190615530565b6118616150e5565b5f8281525f80516020615f15833981519152602052604090819020815160e0810190925280545f80516020615eb5833981519152929190829060ff1660058111156118ae576118ae615326565b60058111156118bf576118bf615326565b81526020016001820180546118d3906154d8565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff906154d8565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a8484613628565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615eb5833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca908690869061598b565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ed58339815191526020526040808220815160e0810190925280545f80516020615e958339815191529284929091829060ff166003811115611b3057611b30615326565b6003811115611b4157611b41615326565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce615326565b14611bef578251604051633b0d540d60e21b81526104da91906004016158e7565b60208301516001600160a01b03163314611c92575f828152600585016020526040902054336001600160a01b0390911603611c8c575f82815260058501602052604090205460a0820151611c5391600160b01b90046001600160401b03169061599a565b6001600160401b0316421015611c875760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611c92565b3361114b565b600281516005811115611ca757611ca7615326565b03611d84578615611cbe57611cbc82876122f7565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611cf7918491611cf291906159ba565b613642565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d3884613799565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611de99350505050565b600481516005811115611d9957611d99615326565b03611dcd57611da783613799565b5f898152600786016020526040902055611dc088612d57565b6001945050505050611de9565b805160405163170cc93360e21b81526104da9190600401615510565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ea3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611eca91908101906159e5565b9150915080611eec57604051636b2f19e960e01b815260040160405180910390fd5b815115611f12578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f4e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611f8a57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b6002811015611fd957611fa1816001615ab7565b611fac9060086158b1565b61ffff16848281518110611fc257611fc26155a7565b016020015160f81c901b9190911790600101611f8d565b5061ffff8116156120035760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561205e5761201a816003615ab7565b6120259060086158b1565b63ffffffff168561203783600261587c565b81518110612047576120476155a7565b016020015160f81c901b9190911790600101612006565b5063ffffffff81161561208457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120d95761209b81601f615ab7565b6120a69060086158b1565b866120b283600661587c565b815181106120c2576120c26155a7565b016020015160f81c901b9190911790600101612087565b50949350505050565b60605f808335602085013560146120fe87870160408901615547565b61210b6060890189615562565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121916060850185615562565b9050811015611f4e57816121a86060860186615562565b838181106121b8576121b86155a7565b90506020028101906121ca91906155bb565b6121d49080615aca565b90506121e36060870187615562565b848181106121f3576121f36155a7565b905060200281019061220591906155bb565b61220f9080615aca565b61221c6060890189615562565b8681811061222c5761222c6155a7565b905060200281019061223e91906155bb565b61224c906020810190615aca565b61225960608b018b615562565b88818110612269576122696155a7565b905060200281019061227b91906155bb565b61228c9060608101906040016152ed565b6040516020016122a29796959493929190615b0c565b60408051601f198184030181529190529150600101612184565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612342573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261236991908101906159e5565b915091508061238b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f29190615530565b825114612418578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615612454576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f806124638460400151613936565b9150915081871461248a5760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615e95833981519152906001600160401b039081169083161115612547575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612566565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615e958339815191528161258a86613b27565b9050612595866122bc565b6125a457600192505050611de9565b5f8681526005830160205260409020546001600160a01b031633146125c9573361114b565b5f86815260058301602052604090205460a08201516125f891600160b01b90046001600160401b03169061599a565b6001600160401b03168160c001516001600160401b0316101561263f5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126575761265087866122f7565b9050612675565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061269a90611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612703573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127279190615530565b905080846008015f8a81526020019081526020015f205f82825461274b919061587c565b90915550501515979650505050505050565b5f80516020615ef583398151915280546001190161278e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61279d6150e5565b5f80516020615eb58339815191525f806127b96113c687611e3f565b9150915080156127e057604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561281157612811615326565b600581111561282257612822615326565b8152602001600182018054612836906154d8565b80601f0160208091040260200160405190810160405280929190818152602001828054612862906154d8565b80156128ad5780601f10612884576101008083540402835291602001916128ad565b820191905f5260205f20905b81548152906001019060200180831161289057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561291857612918615326565b14158015612939575060018151600581111561293657612936615326565b14155b1561295a57805160405163170cc93360e21b81526104da9190600401615510565b60038151600581111561296f5761296f615326565b0361297d5760048152612982565b600581525b8360080181602001516040516129989190615758565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156129dc576129dc615326565b0217905550602082015160018201906129f590826157ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a9b57612a9b615326565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615e7583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b2d575f80fd5b505af1158015612b3f573d5f803e3d5ffd5b50505050505050565b5f80516020615e758339815191525461137a906001600160a01b03168383613e0b565b60015f80516020615ef583398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615e9583398151915290600160401b900461ffff9081169086161080612bd2575061271061ffff8616115b15612bf657604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c32576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c445750806001015483115b15612c655760405163222d164360e21b8152600481018490526024016104da565b5f612c6f84613e6a565b90505f612c7b82610c9f565b90505f612c888983613e8d565b90506040518060800160405280612c9c3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ed58339815191526020526040808220815160e0810190925280545f80516020615e9583398151915293929190829060ff166003811115612da457612da4615326565b6003811115612db557612db5615326565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612ee3575f84815260058701602052604090205461271090612e9590600160a01b900461ffff16856158b1565b612e9f91906158c8565b915081866008015f8681526020019081526020015f205f828254612ec3919061587c565b90915550612ed390508284615ab7565b9050612ee3856020015182612ad2565b612ef88560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f7557835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612fc457612f8c816001615ab7565b612f979060086158b1565b61ffff16868281518110612fad57612fad6155a7565b016020015160f81c901b9190911790600101612f78565b5061ffff811615612fee5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561304957613005816003615ab7565b6130109060086158b1565b63ffffffff168761302283600261587c565b81518110613032576130326155a7565b016020015160f81c901b9190911790600101612ff1565b5063ffffffff811660031461307157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130c65761308881601f615ab7565b6130939060086158b1565b8861309f83600661587c565b815181106130af576130af6155a7565b016020015160f81c901b9190911790600101613074565b505f805b6008811015613125576130de816007615ab7565b6130e99060086158b1565b6001600160401b0316896130fe83602661587c565b8151811061310e5761310e6155a7565b016020015160f81c901b91909117906001016130ca565b505f805b60088110156131845761313d816007615ab7565b6131489060086158b1565b6001600160401b03168a61315d83602e61587c565b8151811061316d5761316d6155a7565b016020015160f81c901b9190911790600101613129565b5091989097509095509350505050565b5f5f80516020615e95833981519152816131b061028f85613e6a565b90505f6131bc87611859565b90506131c7876122bc565b6131e7576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156131fc576131fc615326565b1461321d57805160405163170cc93360e21b81526104da9190600401615510565b5f82826080015161322e919061599a565b905083600201600a9054906101000a90046001600160401b031682604001516132579190615b75565b6001600160401b0316816001600160401b0316111561329457604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132a08a84613642565b915091505f8a836040516020016132ce92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561336157613361615326565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146134a257825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156134f1576134b9816001615ab7565b6134c49060086158b1565b61ffff168582815181106134da576134da6155a7565b016020015160f81c901b91909117906001016134a5565b5061ffff81161561351b5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561357657613532816003615ab7565b61353d9060086158b1565b63ffffffff168661354f83600261587c565b8151811061355f5761355f6155a7565b016020015160f81c901b919091179060010161351e565b5063ffffffff811660021461359e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135f3576135b581601f615ab7565b6135c09060086158b1565b876135cc83600661587c565b815181106135dc576135dc6155a7565b016020015160f81c901b91909117906001016135a1565b505f86602681518110613608576136086155a7565b016020015191976001600160f81b03199092161515965090945050505050565b613630614405565b61363982614450565b61137a816144c4565b5f8281525f80516020615f15833981519152602052604081206002015481905f80516020615eb583398151915290600160801b90046001600160401b031661368a858261452c565b5f6136948761474f565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136e48a858b611df0565b6040518263ffffffff1660e01b8152600401613700919061551e565b6020604051808303815f875af115801561371c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137409190615530565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615e9583398151915290505f6137b98460400151611859565b90505f6003825160058111156137d1576137d1615326565b14806137ef57506004825160058111156137ed576137ed615326565b145b156137ff575060c081015161383c565b60028251600581111561381457613814615326565b0361382057504261383c565b815160405163170cc93360e21b81526104da9190600401615510565b84608001516001600160401b0316816001600160401b03161161386357505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061388890611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613909573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061392d9190615530565b95945050505050565b5f808251602e1461396c57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b60028110156139bb57613983816001615ab7565b61398e9060086158b1565b61ffff168582815181106139a4576139a46155a7565b016020015160f81c901b919091179060010161396f565b5061ffff8116156139e55760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a40576139fc816003615ab7565b613a079060086158b1565b63ffffffff1686613a1983600261587c565b81518110613a2957613a296155a7565b016020015160f81c901b91909117906001016139e8565b5063ffffffff811615613a6657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613abb57613a7d81601f615ab7565b613a889060086158b1565b87613a9483600661587c565b81518110613aa457613aa46155a7565b016020015160f81c901b9190911790600101613a69565b505f805b6008811015613b1a57613ad3816007615ab7565b613ade9060086158b1565b6001600160401b031688613af383602661587c565b81518110613b0357613b036155a7565b016020015160f81c901b9190911790600101613abf565b5090969095509350505050565b613b2f6150e5565b5f8281525f80516020615f158339815191526020526040808220815160e0810190925280545f80516020615eb583398151915293929190829060ff166005811115613b7c57613b7c615326565b6005811115613b8d57613b8d615326565b8152602001600182018054613ba1906154d8565b80601f0160208091040260200160405190810160405280929190818152602001828054613bcd906154d8565b8015613c185780601f10613bef57610100808354040283529160200191613c18565b820191905f5260205f20905b815481529060010190602001808311613bfb57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c8657613c86615326565b14613cb9575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615510565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cfd57613cfd615326565b021790555060208201516001820190613d1690826157ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613db48582613642565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506147c4565b5f610cf3825f80516020615e75833981519152546001600160a01b031690614825565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ed157604051637fab81e560e01b815260040160405180910390fd5b5f80516020615eb583398151915242613ef060608601604087016152ed565b6001600160401b0316111580613f2a5750613f0e6202a3004261587c565b613f1e60608601604087016152ed565b6001600160401b031610155b15613f6457613f3f60608501604086016152ed565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f79613f746060860186615ba0565b61497e565b613f89613f746080860186615ba0565b6030613f986020860186615aca565b905014613fca57613fac6020850185615aca565b6040516326475b2f60e11b81526104da925060040190815260200190565b613fd48480615aca565b90505f0361400157613fe68480615aca565b604051633e08a12560e11b81526004016104da929190615bb4565b5f600882016140108680615aca565b60405161401e92919061598b565b908152602001604051809103902054146140575761403c8480615aca565b60405163a41f772f60e01b81526004016104da929190615bb4565b614061835f61452c565b6040805160e08101909152815481525f90819061416d90602081016140868980615aca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906140ce908a018a615aca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161411760608a0160408b016152ed565b6001600160401b0316815260200161413260608a018a615ba0565b61413b90615be2565b815260200161414d60808a018a615ba0565b61415690615be2565b8152602001876001600160401b0316815250614ae7565b5f8281526006860160205260409020919350915061418b82826157ad565b50816008840161419b8880615aca565b6040516141a992919061598b565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141e590859060040161551e565b6020604051808303815f875af1158015614201573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142259190615530565b6040805160e0810190915290915080600181526020016142458980615aca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156142d4576142d4615326565b0217905550602082015160018201906142ed90826157ad565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061438b8880615aca565b60405161439992919061598b565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906143d791906152ed565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661444e57604051631afcd79f60e31b815260040160405180910390fd5b565b614458614405565b61446181614cd4565b614469614ced565b610dc26060820135608083013561448660c0850160a086016152ed565b61449660e0860160c08701615ca9565b6144a7610100870160e08801615cc2565b6101008701356144bf61014089016101208a01615547565b614cfd565b6144cc614405565b5f80516020615e758339815191526001600160a01b03821661450c57604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615eb58339815191525f6001600160401b0380841690851611156145605761455983856159ba565b905061456d565b61456a84846159ba565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145cf5750600184015481516145cb916001600160401b03169061587c565b8210155b156145f5576001600160401b038316606082015281815260408101516020820152614614565b8281606001818151614607919061599a565b6001600160401b03169052505b6060810151614624906064615b75565b602082015160018601546001600160401b03929092169161464f9190600160401b900460ff166158b1565b101561467f57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b03168160400181815161469a919061587c565b9052506040810180516001600160401b03871691906146ba908390615ab7565b905250600184015460408201516064916146df91600160401b90910460ff16906158b1565b1015614706578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f158339815191526020526040812060020180545f80516020615eb5833981519152919060089061479990600160401b90046001600160401b0316615ce2565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6147d86001600160a01b03841683614e52565b905080515f141580156147fc5750808060200190518101906147fa9190615cfd565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561486b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061488f9190615530565b90506148a66001600160a01b038516333086614e5f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156148ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061490e9190615530565b90508181116149745760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b61392d8282615ab7565b61498b6020820182615220565b63ffffffff161580156149ab57506149a66020820182615562565b151590505b156149f2576149bd6020820182615220565b6149ca6020830183615562565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b6149ff6020820182615562565b9050614a0e6020830183615220565b63ffffffff161115614a27576149bd6020820182615220565b60015b614a376020830183615562565b905081101561137a57614a4d6020830183615562565b614a58600184615ab7565b818110614a6757614a676155a7565b9050602002016020810190614a7c9190615547565b6001600160a01b0316614a926020840184615562565b83818110614aa257614aa26155a7565b9050602002016020810190614ab79190615547565b6001600160a01b03161015614adf57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a2a565b5f6060826040015151603014614b105760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b51988a986001989297929690959094909390929101615d18565b60405160208183030381529060405290505f5b84608001516020015151811015614bc357818560800151602001518281518110614b9057614b906155a7565b6020026020010151604051602001614ba9929190615dd2565b60408051601f198184030181529190529150600101614b64565b5060a0840151805160209182015151604051614be3938593929101615e08565b60405160208183030381529060405290505f5b8460a001516020015151811015614c5557818560a00151602001518281518110614c2257614c226155a7565b6020026020010151604051602001614c3b929190615dd2565b60408051601f198184030181529190529150600101614bf6565b5060c0840151604051614c6c918391602001615e43565b6040516020818303038152906040529050600281604051614c8d9190615758565b602060405180830381855afa158015614ca8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ccb9190615530565b94909350915050565b614cdc614405565b614ce4614e98565b610dc281614ea0565b614cf5614405565b61444e614f88565b614d05614405565b5f80516020615e9583398151915261ffff85161580614d29575061271061ffff8616115b15614d4d57604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614d715760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614d845750600a60ff8516115b15614da75760405163170db35960e31b815260ff851660048201526024016104da565b825f03614dc75760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611de983835f614f90565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e38565b61444e614405565b614ea8614405565b80355f80516020615eb58339815191529081556014614ecd6060840160408501615cc2565b60ff161180614eec5750614ee76060830160408401615cc2565b60ff16155b15614f2057614f016060830160408401615cc2565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614f306060830160408401615cc2565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f6160408301602084016152ed565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b6b614405565b606081471015614fb55760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614fd09190615758565b5f6040518083038185875af1925050503d805f811461500a576040519150601f19603f3d011682016040523d82523d5f602084013e61500f565b606091505b509150915061501f868383615029565b9695505050505050565b60608261503e5761503982615085565b611de9565b815115801561505557506001600160a01b0384163b155b1561507e57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611de9565b8051156150955780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546150ba906154d8565b5f825580601f106150c9575050565b601f0160209004905f5260205f2090810190610dc29190615122565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615136575f8155600101615123565b5090565b8015158114610dc2575f80fd5b803563ffffffff8116811461515a575f80fd5b919050565b5f805f60608486031215615171575f80fd5b8335925060208401356151838161513a565b915061519160408501615147565b90509250925092565b5f602082840312156151aa575f80fd5b5035919050565b5f80604083850312156151c2575f80fd5b82356001600160401b038111156151d7575f80fd5b8301608081860312156151e8575f80fd5b91506151f660208401615147565b90509250929050565b5f8060408385031215615210575f80fd5b823591506151f660208401615147565b5f60208284031215615230575f80fd5b611de982615147565b803561ffff8116811461515a575f80fd5b80356001600160401b038116811461515a575f80fd5b5f805f8060808587031215615273575f80fd5b84356001600160401b03811115615288575f80fd5b850160a08188031215615299575f80fd5b93506152a760208601615239565b92506152b56040860161524a565b9396929550929360600135925050565b5f80604083850312156152d6575f80fd5b6152df83615147565b946020939093013593505050565b5f602082840312156152fd575f80fd5b611de98261524a565b5f8060408385031215615317575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061534a5761534a615326565b9052565b5f5b83811015615368578181015183820152602001615350565b50505f910152565b5f815180845261538781602086016020860161534e565b601f01601f19169290920160200192915050565b602081526153ad60208201835161533a565b5f602083015160e060408401526153c8610100840182615370565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f80828403610160811215615442575f80fd5b61014080821215615451575f80fd5b84935083013590506154628161541b565b809150509250929050565b5f806020838503121561547e575f80fd5b82356001600160401b0380821115615494575f80fd5b818501915085601f8301126154a7575f80fd5b8135818111156154b5575f80fd5b8660208285010111156154c6575f80fd5b60209290920196919550909350505050565b600181811c908216806154ec57607f821691505b60208210810361550a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf3828461533a565b602081525f611de96020830184615370565b5f60208284031215615540575f80fd5b5051919050565b5f60208284031215615557575f80fd5b8135611de98161541b565b5f808335601e19843603018112615577575f80fd5b8301803591506001600160401b03821115615590575f80fd5b6020019150600581901b3603821315613792575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155cf575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561560f5761560f6155d9565b60405290565b604080519081016001600160401b038111828210171561560f5761560f6155d9565b604051601f8201601f191681016001600160401b038111828210171561565f5761565f6155d9565b604052919050565b5f6001600160401b0382111561567f5761567f6155d9565b50601f01601f191660200190565b5f82601f83011261569c575f80fd5b81356156af6156aa82615667565b615637565b8181528460208386010111156156c3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156156ef575f80fd5b6156f76155ed565b82356001600160401b038082111561570d575f80fd5b6157193683870161568d565b8352602085013591508082111561572e575f80fd5b5061573b3682860161568d565b60208301525061574d6040840161524a565b604082015292915050565b5f82516155cf81846020870161534e565b601f8211156104e357805f5260205f20601f840160051c8101602085101561578e5750805b601f840160051c820191505b81811015611715575f815560010161579a565b81516001600160401b038111156157c6576157c66155d9565b6157da816157d484546154d8565b84615769565b602080601f83116001811461580d575f84156157f65750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b8281101561583b5788860151825594840194600190910190840161581c565b508582101561585857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615868565b5f63ffffffff8083168181036158a7576158a7615868565b6001019392505050565b8082028115828204841417610cf357610cf3615868565b5f826158e257634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106158fb576158fb615326565b91905290565b5f60208083525f8454615913816154d8565b806020870152604060018084165f811461593457600181146159505761597d565b60ff19851660408a0152604084151560051b8a0101955061597d565b895f5260205f205f5b858110156159745781548b8201860152908301908801615959565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f4e57611f4e615868565b6001600160401b03828116828216039080821115611f4e57611f4e615868565b805161515a8161513a565b5f80604083850312156159f6575f80fd5b82516001600160401b0380821115615a0c575f80fd5b9084019060608287031215615a1f575f80fd5b615a276155ed565b82518152602080840151615a3a8161541b565b82820152604084015183811115615a4f575f80fd5b80850194505087601f850112615a63575f80fd5b83519250615a736156aa84615667565b8381528882858701011115615a86575f80fd5b615a958483830184880161534e565b80604084015250819550615aaa8188016159da565b9450505050509250929050565b81810381811115610cf357610cf3615868565b5f808335601e19843603018112615adf575f80fd5b8301803591506001600160401b03821115615af8575f80fd5b602001915036819003821315613792575f80fd5b5f8851615b1d818460208d0161534e565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615b9857615b98615868565b505092915050565b5f8235603e198336030181126155cf575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615bf2575f80fd5b615bfa615615565b615c0383615147565b81526020808401356001600160401b0380821115615c1f575f80fd5b9085019036601f830112615c31575f80fd5b813581811115615c4357615c436155d9565b8060051b9150615c54848301615637565b8181529183018401918481019036841115615c6d575f80fd5b938501935b83851015615c975784359250615c878361541b565b8282529385019390850190615c72565b94860194909452509295945050505050565b5f60208284031215615cb9575f80fd5b611de982615239565b5f60208284031215615cd2575f80fd5b813560ff81168114611de9575f80fd5b5f6001600160401b038083168181036158a7576158a7615868565b5f60208284031215615d0d575f80fd5b8151611de98161513a565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615d5e81602a850160208b0161534e565b865190830190615d7581602a840160208b0161534e565b60c087901b6001600160c01b031916602a9290910191820152615da7603282018660e01b6001600160e01b0319169052565b615dc0603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615de381846020880161534e565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615e1981846020890161534e565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615e5481846020880161534e565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index bc76239ee..20f762265 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d91380380615d9183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c448061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614efb565b610615565b005b348015610221575f80fd5b50610214610230366004614f36565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614efb565b610858565b34801561028a575f80fd5b50610214610299366004614f4d565b610863565b3480156102a9575f80fd5b506102146102b8366004614f9b565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614f36565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614efb565b610e53565b348015610378575f80fd5b50610214610387366004614fbc565b610e5e565b348015610397575f80fd5b506102146103a6366004614fd5565b610f1f565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004615013565b61118a565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614f36565b6111c1565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614efb565b6111d5565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614f36565b611200565b348015610490575f80fd5b5061021461049f366004614fd5565b6112cb565b3480156104af575f80fd5b506102146104be366004614fbc565b6114a3565b6103f36104d136600461503d565b61162c565b3480156104e1575f80fd5b506103f35f80516020615b9883398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614f36565b611660565b34801561053a575f80fd5b506103f35f80516020615bb883398151915281565b34801561055a575f80fd5b50610214610569366004614f36565b611849565b348015610579575f80fd5b50610214610588366004615091565b611986565b6103f361059b366004614f36565b611a63565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614f36565b611a94565b604051610257919061511d565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f361061036600461519d565b611be3565b610620838383611c3e565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615c188339815191526020526040808220815160e0810190925280545f80516020615bb883398151915293929190829060ff166005811115610697576106976150a8565b60058111156106a8576106a86150a8565b81526020016001820180546106bc90615208565b80601f01602080910402602001604051908101604052809291908181526020018280546106e890615208565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6150a8565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161523a565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f45565b6040518263ffffffff1660e01b81526004016108129190615248565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061525a565b50505050565b610852838383611c3e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615bb88339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c919061525a565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b306109566060850160408601615285565b6001600160a01b031614610999576109746060840160408501615285565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856152a0565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886152a0565b8363ffffffff168181106109e0576109e06152e5565b90506020028101906109f291906152f9565b6109fb9061541d565b80516040519192505f916008880191610a1391615496565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c9190600401615248565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c91615496565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca919061525a565b90508086600801835f0151604051610ae29190615496565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646150a8565b021790555060208201516001820190610b7d90826154eb565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c229116856155ba565b8251604051919550610c3391615496565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c88906155cd565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836155ef565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611f94565b604001516120aa565b90505f610cf787612237565b90505f600282604051610d0a9190615496565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d48919061525a565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612411565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a94565b5190506002816005811115610dd757610dd76150a8565b14610df7578060405163170cc93360e21b815260040161063c919061523a565b610852838361244c565b5f805f80516020615b9883398151915260030154610e1f9084615606565b9050806001600160401b03165f03610e4d5760405163222d164360e21b81526004810184905260240161063c565b92915050565b6108528383836126c6565b610e666128b2565b5f80516020615b988339815191525f80610e7f846128e9565b91509150610e8c82612411565b610e9857505050610f06565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ec657610ec66150a8565b03610eeb575f83815260088501602052604081208054919055610ee98282612c27565b505b610f0181610efc846040015161118a565b612c85565b505050505b610f1c60015f80516020615bf883398151915255565b50565b5f8181525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b9883398151915293929190829060ff166003811115610f6c57610f6c6150a8565b6003811115610f7d57610f7d6150a8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ff382611a94565b905060018351600381111561100a5761100a6150a8565b1461102b578251604051633b0d540d60e21b815261063c9190600401615625565b600481516005811115611040576110406150a8565b036110565761104e85612cab565b505050505050565b5f8061106d61106489611f94565b60400151612e92565b509150915081841461109a57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110d35750806001600160401b03168560a001516001600160401b0316115b156110fc57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e4d906001600160401b0384166155ef565b5f6111cb82611a94565b6080015192915050565b6111e08383836126c6565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615b988339815191525f61121883611a94565b519050600481600581111561122f5761122f6150a8565b1461124f578060405163170cc93360e21b815260040161063c919061523a565b5f8381526005830160205260409020546001600160a01b0316331461129557335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c27565b6112d36128b2565b5f8181525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b9883398151915293929190829060ff166003811115611320576113206150a8565b6003811115611331576113316150a8565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113aa576113aa6150a8565b146113cb578051604051633b0d540d60e21b815261063c9190600401615625565b60046113da8260400151611a94565b5160058111156113ec576113ec6150a8565b1461147e575f6113fb85611f94565b90505f8061140c8360400151612e92565b5091509150818460400151146114385760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561147a57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148783612cab565b505061149f60015f80516020615bf883398151915255565b5050565b5f80516020615bb88339815191525f806114c86114bf85611f94565b604001516130e8565b91509150806114ee57604051632d07135360e01b8152811515600482015260240161063c565b5f8281526006840160205260409020805461150890615208565b90505f0361152c5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff166005811115611552576115526150a8565b14611585575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff169060040161523a565b5f828152600684016020526040812061159d91614e4f565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116356128b2565b611641848484346132a4565b905061165960015f80516020615bf883398151915255565b9392505050565b5f8181525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b9883398151915293929190829060ff1660038111156116ad576116ad6150a8565b60038111156116be576116be6150a8565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611737576117376150a8565b141580156117585750600381516003811115611755576117556150a8565b14155b15611779578051604051633b0d540d60e21b815261063c9190600401615625565b5f6117878260400151611a94565b905080606001516001600160401b03165f036117b9576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117e6846040015184606001518560800151611f45565b6040518263ffffffff1660e01b81526004016118029190615248565b6020604051808303815f875af115801561181e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611842919061525a565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615bb8833981519152919061189090615208565b90505f036118b45760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118da576118da6150a8565b1461190d575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff169060040161523a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611946919060040161563f565b6020604051808303815f875af1158015611962573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610645919061525a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119cf575080546001600160401b03808416911610155b156119ed5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1783613472565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a6c6128b2565b611a77823334613483565b9050611a8f60015f80516020615bf883398151915255565b919050565b611a9c614e86565b5f8281525f80516020615c18833981519152602052604090819020815160e0810190925280545f80516020615bb8833981519152929190829060ff166005811115611ae957611ae96150a8565b6005811115611afa57611afa6150a8565b8152602001600182018054611b0e90615208565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90615208565b8015611b855780601f10611b5c57610100808354040283529160200191611b85565b820191905f5260205f20905b815481529060010190602001808311611b6857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615bb8833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2690869086906156c9565b90815260200160405180910390205491505092915050565b5f8381525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b988339815191529284929091829060ff166003811115611c8c57611c8c6150a8565b6003811115611c9d57611c9d6150a8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1382611a94565b9050600283516003811115611d2a57611d2a6150a8565b14611d4b578251604051633b0d540d60e21b815261063c9190600401615625565b60208301516001600160a01b03163314611dee575f828152600585016020526040902054336001600160a01b0390911603611de8575f82815260058501602052604090205460a0820151611daf91600160b01b90046001600160401b0316906156d8565b6001600160401b0316421015611de35760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611dee565b33611270565b600281516005811115611e0357611e036150a8565b03611ee0578615611e1a57611e18828761244c565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611e53918491611e4e91906156f8565b613758565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e94846138af565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116599350505050565b600481516005811115611ef557611ef56150a8565b03611f2957611f03836138af565b5f898152600786016020526040902055611f1c88612cab565b6001945050505050611659565b805160405163170cc93360e21b815261063c919060040161523a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ff8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261201f9190810190615723565b915091508061204157604051636b2f19e960e01b815260040160405180910390fd5b815115612067578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120a3576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f81516026146120df57815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b600281101561212e576120f68160016157f5565b6121019060086155ef565b61ffff16848281518110612117576121176152e5565b016020015160f81c901b91909117906001016120e2565b5061ffff8116156121585760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156121b35761216f8160036157f5565b61217a9060086155ef565b63ffffffff168561218c8360026155ba565b8151811061219c5761219c6152e5565b016020015160f81c901b919091179060010161215b565b5063ffffffff8116156121d957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561222e576121f081601f6157f5565b6121fb9060086155ef565b866122078360066155ba565b81518110612217576122176152e5565b016020015160f81c901b91909117906001016121dc565b50949350505050565b60605f8083356020850135601461225387870160408901615285565b61226060608901896152a0565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6122e660608501856152a0565b90508110156120a357816122fd60608601866152a0565b8381811061230d5761230d6152e5565b905060200281019061231f91906152f9565b6123299080615808565b905061233860608701876152a0565b84818110612348576123486152e5565b905060200281019061235a91906152f9565b6123649080615808565b61237160608901896152a0565b86818110612381576123816152e5565b905060200281019061239391906152f9565b6123a1906020810190615808565b6123ae60608b018b6152a0565b888181106123be576123be6152e5565b90506020028101906123d091906152f9565b6123e1906060810190604001615013565b6040516020016123f7979695949392919061584a565b60408051601f1981840301815291905291506001016122d9565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612497573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124be9190810190615723565b91509150806124e057604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612523573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612547919061525a565b82511461256d578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125a9576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806125b88460400151613a4c565b915091508187146125df5760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615b98833981519152906001600160401b03908116908316111561269c575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26126bb565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b98833981519152816126df86613c3d565b90506126ea86612411565b6126f957600192505050611659565b5f8681526005830160205260409020546001600160a01b0316331461271e5733611270565b5f86815260058301602052604090205460a082015161274d91600160b01b90046001600160401b0316906156d8565b6001600160401b03168160c001516001600160401b031610156127945760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127ac576127a5878661244c565b90506127ca565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127ef9061118a565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612858573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287c919061525a565b905080846008015f8a81526020019081526020015f205f8282546128a091906155ba565b90915550501515979650505050505050565b5f80516020615bf88339815191528054600119016128e357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128f2614e86565b5f80516020615bb88339815191525f8061290e6114bf87611f94565b91509150801561293557604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612966576129666150a8565b6005811115612977576129776150a8565b815260200160018201805461298b90615208565b80601f01602080910402602001604051908101604052809291908181526020018280546129b790615208565b8015612a025780601f106129d957610100808354040283529160200191612a02565b820191905f5260205f20905b8154815290600101906020018083116129e557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a6d57612a6d6150a8565b14158015612a8e5750600181516005811115612a8b57612a8b6150a8565b14155b15612aaf57805160405163170cc93360e21b815261063c919060040161523a565b600381516005811115612ac457612ac46150a8565b03612ad25760048152612ad7565b600581525b836008018160200151604051612aed9190615496565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b3157612b316150a8565b021790555060208201516001820190612b4a90826154eb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bf057612bf06150a8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c73575f80fd5b505af115801561104e573d5f803e3d5ffd5b61149f6001600160a01b03831682613f21565b60015f80516020615bf883398151915255565b5f8181525f80516020615bd88339815191526020526040808220815160e0810190925280545f80516020615b9883398151915293929190829060ff166003811115612cf857612cf86150a8565b6003811115612d0957612d096150a8565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e37575f84815260058701602052604090205461271090612de990600160a01b900461ffff16856155ef565b612df39190615606565b915081866008015f8681526020019081526020015f205f828254612e1791906155ba565b90915550612e27905082846157f5565b9050612e37856020015182612c27565b612e4c8560200151610efc876060015161118a565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ec957835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612f1857612ee08160016157f5565b612eeb9060086155ef565b61ffff16868281518110612f0157612f016152e5565b016020015160f81c901b9190911790600101612ecc565b5061ffff811615612f425760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f9d57612f598160036157f5565b612f649060086155ef565b63ffffffff1687612f768360026155ba565b81518110612f8657612f866152e5565b016020015160f81c901b9190911790600101612f45565b5063ffffffff8116600314612fc557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561301a57612fdc81601f6157f5565b612fe79060086155ef565b88612ff38360066155ba565b81518110613003576130036152e5565b016020015160f81c901b9190911790600101612fc8565b505f805b6008811015613079576130328160076157f5565b61303d9060086155ef565b6001600160401b0316896130528360266155ba565b81518110613062576130626152e5565b016020015160f81c901b919091179060010161301e565b505f805b60088110156130d8576130918160076157f5565b61309c9060086155ef565b6001600160401b03168a6130b183602e6155ba565b815181106130c1576130c16152e5565b016020015160f81c901b919091179060010161307d565b5091989097509095509350505050565b5f80825160271461311e57825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561316d576131358160016157f5565b6131409060086155ef565b61ffff16858281518110613156576131566152e5565b016020015160f81c901b9190911790600101613121565b5061ffff8116156131975760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131f2576131ae8160036157f5565b6131b99060086155ef565b63ffffffff16866131cb8360026155ba565b815181106131db576131db6152e5565b016020015160f81c901b919091179060010161319a565b5063ffffffff811660021461321a57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561326f5761323181601f6157f5565b61323c9060086155ef565b876132488360066155ba565b81518110613258576132586152e5565b016020015160f81c901b919091179060010161321d565b505f86602681518110613284576132846152e5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b9883398151915290600160401b900461ffff90811690861610806132f8575061271061ffff8616115b1561331c57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613358576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b805483108061336a5750806001015483115b1561338b5760405163222d164360e21b81526004810184905260240161063c565b825f61339682610e01565b90505f6133a38983613fb4565b905060405180608001604052806133b73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61347a61452c565b610f1c81614577565b5f5f80516020615b988339815191528161349c84610e01565b90505f6134a887611a94565b90506134b387612411565b6134d3576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156134e8576134e86150a8565b1461350957805160405163170cc93360e21b815261063c919060040161523a565b5f82826080015161351a91906156d8565b905083600201600a9054906101000a90046001600160401b0316826040015161354391906158b3565b6001600160401b0316816001600160401b0316111561358057604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061358c8a84613758565b915091505f8a836040516020016135ba92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561364d5761364d6150a8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615c18833981519152602052604081206002015481905f80516020615bb883398151915290600160801b90046001600160401b03166137a085826145eb565b5f6137aa8761480e565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137fa8a858b611f45565b6040518263ffffffff1660e01b81526004016138169190615248565b6020604051808303815f875af1158015613832573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613856919061525a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b9883398151915290505f6138cf8460400151611a94565b90505f6003825160058111156138e7576138e76150a8565b14806139055750600482516005811115613903576139036150a8565b145b15613915575060c0810151613952565b60028251600581111561392a5761392a6150a8565b03613936575042613952565b815160405163170cc93360e21b815261063c919060040161523a565b84608001516001600160401b0316816001600160401b03161161397957505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061399e9061118a565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a43919061525a565b95945050505050565b5f808251602e14613a8257825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613ad157613a998160016157f5565b613aa49060086155ef565b61ffff16858281518110613aba57613aba6152e5565b016020015160f81c901b9190911790600101613a85565b5061ffff811615613afb5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b5657613b128160036157f5565b613b1d9060086155ef565b63ffffffff1686613b2f8360026155ba565b81518110613b3f57613b3f6152e5565b016020015160f81c901b9190911790600101613afe565b5063ffffffff811615613b7c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bd157613b9381601f6157f5565b613b9e9060086155ef565b87613baa8360066155ba565b81518110613bba57613bba6152e5565b016020015160f81c901b9190911790600101613b7f565b505f805b6008811015613c3057613be98160076157f5565b613bf49060086155ef565b6001600160401b031688613c098360266155ba565b81518110613c1957613c196152e5565b016020015160f81c901b9190911790600101613bd5565b5090969095509350505050565b613c45614e86565b5f8281525f80516020615c188339815191526020526040808220815160e0810190925280545f80516020615bb883398151915293929190829060ff166005811115613c9257613c926150a8565b6005811115613ca357613ca36150a8565b8152602001600182018054613cb790615208565b80601f0160208091040260200160405190810160405280929190818152602001828054613ce390615208565b8015613d2e5780601f10613d0557610100808354040283529160200191613d2e565b820191905f5260205f20905b815481529060010190602001808311613d1157829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d9c57613d9c6150a8565b14613dcf575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161523a565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e1357613e136150a8565b021790555060208201516001820190613e2c90826154eb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613eca8582613758565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f445760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f8d576040519150601f19603f3d011682016040523d82523d5f602084013e613f92565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ff857604051637fab81e560e01b815260040160405180910390fd5b5f80516020615bb8833981519152426140176060860160408701615013565b6001600160401b031611158061405157506140356202a300426155ba565b6140456060860160408701615013565b6001600160401b031610155b1561408b576140666060850160408601615013565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6140a061409b60608601866158de565b614883565b6140b061409b60808601866158de565b60306140bf6020860186615808565b9050146140f1576140d36020850185615808565b6040516326475b2f60e11b815261063c925060040190815260200190565b6140fb8480615808565b90505f036141285761410d8480615808565b604051633e08a12560e11b815260040161063c9291906158f2565b5f600882016141378680615808565b6040516141459291906156c9565b9081526020016040518091039020541461417e576141638480615808565b60405163a41f772f60e01b815260040161063c9291906158f2565b614188835f6145eb565b6040805160e08101909152815481525f90819061429490602081016141ad8980615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141f5908a018a615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161423e60608a0160408b01615013565b6001600160401b0316815260200161425960608a018a6158de565b61426290615920565b815260200161427460808a018a6158de565b61427d90615920565b8152602001876001600160401b03168152506149ec565b5f828152600686016020526040902091935091506142b282826154eb565b5081600884016142c28880615808565b6040516142d09291906156c9565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061430c908590600401615248565b6020604051808303815f875af1158015614328573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061434c919061525a565b6040805160e08101909152909150806001815260200161436c8980615808565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143fb576143fb6150a8565b02179055506020820151600182019061441490826154eb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144b28880615808565b6040516144c09291906156c9565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144fe9190615013565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661457557604051631afcd79f60e31b815260040160405180910390fd5b565b61457f61452c565b61458881614bd9565b614590614bf2565b610f1c606082013560808301356145ad60c0850160a08601615013565b6145bd60e0860160c087016159e7565b6145ce610100870160e08801615a00565b6101008701356145e661014089016101208a01615285565b614c02565b5f80516020615bb88339815191525f6001600160401b03808416908516111561461f5761461883856156f8565b905061462c565b61462984846156f8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061468e57506001840154815161468a916001600160401b0316906155ba565b8210155b156146b4576001600160401b0383166060820152818152604081015160208201526146d3565b82816060018181516146c691906156d8565b6001600160401b03169052505b60608101516146e39060646158b3565b602082015160018601546001600160401b03929092169161470e9190600160401b900460ff166155ef565b101561473e57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161475991906155ba565b9052506040810180516001600160401b03871691906147799083906157f5565b9052506001840154604082015160649161479e91600160401b90910460ff16906155ef565b10156147c5578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c188339815191526020526040812060020180545f80516020615bb8833981519152919060089061485890600160401b90046001600160401b0316615a20565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148906020820182614fbc565b63ffffffff161580156148b057506148ab60208201826152a0565b151590505b156148f7576148c26020820182614fbc565b6148cf60208301836152a0565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b61490460208201826152a0565b90506149136020830183614fbc565b63ffffffff16111561492c576148c26020820182614fbc565b60015b61493c60208301836152a0565b905081101561149f5761495260208301836152a0565b61495d6001846157f5565b81811061496c5761496c6152e5565b90506020020160208101906149819190615285565b6001600160a01b031661499760208401846152a0565b838181106149a7576149a76152e5565b90506020020160208101906149bc9190615285565b6001600160a01b031610156149e457604051630dbc8d5f60e31b815260040160405180910390fd5b60010161492f565b5f6060826040015151603014614a155760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a56988a986001989297929690959094909390929101615a3b565b60405160208183030381529060405290505f5b84608001516020015151811015614ac857818560800151602001518281518110614a9557614a956152e5565b6020026020010151604051602001614aae929190615af5565b60408051601f198184030181529190529150600101614a69565b5060a0840151805160209182015151604051614ae8938593929101615b2b565b60405160208183030381529060405290505f5b8460a001516020015151811015614b5a57818560a00151602001518281518110614b2757614b276152e5565b6020026020010151604051602001614b40929190615af5565b60408051601f198184030181529190529150600101614afb565b5060c0840151604051614b71918391602001615b66565b6040516020818303038152906040529050600281604051614b929190615496565b602060405180830381855afa158015614bad573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bd0919061525a565b94909350915050565b614be161452c565b614be9614d57565b610f1c81614d5f565b614bfa61452c565b614575614e47565b614c0a61452c565b5f80516020615b9883398151915261ffff85161580614c2e575061271061ffff8616115b15614c5257604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614c765760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614c895750600a60ff8516115b15614cac5760405163170db35960e31b815260ff8516600482015260240161063c565b825f03614ccc5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61457561452c565b614d6761452c565b80355f80516020615bb88339815191529081556014614d8c6060840160408501615a00565b60ff161180614dab5750614da66060830160408401615a00565b60ff16155b15614ddf57614dc06060830160408401615a00565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614def6060830160408401615a00565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e206040830160208401615013565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c9861452c565b508054614e5b90615208565b5f825580601f10614e6a575050565b601f0160209004905f5260205f2090810190610f1c9190614ec3565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ed7575f8155600101614ec4565b5090565b8015158114610f1c575f80fd5b803563ffffffff81168114611a8f575f80fd5b5f805f60608486031215614f0d575f80fd5b833592506020840135614f1f81614edb565b9150614f2d60408501614ee8565b90509250925092565b5f60208284031215614f46575f80fd5b5035919050565b5f8060408385031215614f5e575f80fd5b82356001600160401b03811115614f73575f80fd5b830160808186031215614f84575f80fd5b9150614f9260208401614ee8565b90509250929050565b5f8060408385031215614fac575f80fd5b82359150614f9260208401614ee8565b5f60208284031215614fcc575f80fd5b61165982614ee8565b5f8060408385031215614fe6575f80fd5b614fef83614ee8565b946020939093013593505050565b80356001600160401b0381168114611a8f575f80fd5b5f60208284031215615023575f80fd5b61165982614ffd565b803561ffff81168114611a8f575f80fd5b5f805f6060848603121561504f575f80fd5b83356001600160401b03811115615064575f80fd5b840160a08187031215615075575f80fd5b92506150836020850161502c565b9150614f2d60408501614ffd565b5f61014082840312156150a2575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106150cc576150cc6150a8565b9052565b5f5b838110156150ea5781810151838201526020016150d2565b50505f910152565b5f81518084526151098160208601602086016150d0565b601f01601f19169290920160200192915050565b6020815261512f6020820183516150bc565b5f602083015160e0604084015261514a6101008401826150f2565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156151ae575f80fd5b82356001600160401b03808211156151c4575f80fd5b818501915085601f8301126151d7575f80fd5b8135818111156151e5575f80fd5b8660208285010111156151f6575f80fd5b60209290920196919550909350505050565b600181811c9082168061521c57607f821691505b6020821081036150a257634e487b7160e01b5f52602260045260245ffd5b60208101610e4d82846150bc565b602081525f61165960208301846150f2565b5f6020828403121561526a575f80fd5b5051919050565b6001600160a01b0381168114610f1c575f80fd5b5f60208284031215615295575f80fd5b813561165981615271565b5f808335601e198436030181126152b5575f80fd5b8301803591506001600160401b038211156152ce575f80fd5b6020019150600581901b36038213156138a8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261530d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561534d5761534d615317565b60405290565b604080519081016001600160401b038111828210171561534d5761534d615317565b604051601f8201601f191681016001600160401b038111828210171561539d5761539d615317565b604052919050565b5f6001600160401b038211156153bd576153bd615317565b50601f01601f191660200190565b5f82601f8301126153da575f80fd5b81356153ed6153e8826153a5565b615375565b818152846020838601011115615401575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561542d575f80fd5b61543561532b565b82356001600160401b038082111561544b575f80fd5b615457368387016153cb565b8352602085013591508082111561546c575f80fd5b50615479368286016153cb565b60208301525061548b60408401614ffd565b604082015292915050565b5f825161530d8184602087016150d0565b601f82111561064557805f5260205f20601f840160051c810160208510156154cc5750805b601f840160051c820191505b81811015611842575f81556001016154d8565b81516001600160401b0381111561550457615504615317565b615518816155128454615208565b846154a7565b602080601f83116001811461554b575f84156155345750858301515b5f19600386901b1c1916600185901b17855561104e565b5f85815260208120601f198616915b828110156155795788860151825594840194600190910190840161555a565b508582101561559657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e4d57610e4d6155a6565b5f63ffffffff8083168181036155e5576155e56155a6565b6001019392505050565b8082028115828204841417610e4d57610e4d6155a6565b5f8261562057634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615639576156396150a8565b91905290565b5f60208083525f845461565181615208565b806020870152604060018084165f8114615672576001811461568e576156bb565b60ff19851660408a0152604084151560051b8a010195506156bb565b895f5260205f205f5b858110156156b25781548b8201860152908301908801615697565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120a3576120a36155a6565b6001600160401b038281168282160390808211156120a3576120a36155a6565b8051611a8f81614edb565b5f8060408385031215615734575f80fd5b82516001600160401b038082111561574a575f80fd5b908401906060828703121561575d575f80fd5b61576561532b565b8251815260208084015161577881615271565b8282015260408401518381111561578d575f80fd5b80850194505087601f8501126157a1575f80fd5b835192506157b16153e8846153a5565b83815288828587010111156157c4575f80fd5b6157d3848383018488016150d0565b806040840152508195506157e8818801615718565b9450505050509250929050565b81810381811115610e4d57610e4d6155a6565b5f808335601e1984360301811261581d575f80fd5b8301803591506001600160401b03821115615836575f80fd5b6020019150368190038213156138a8575f80fd5b5f885161585b818460208d016150d0565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146158d6576158d66155a6565b505092915050565b5f8235603e1983360301811261530d575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615930575f80fd5b615938615353565b61594183614ee8565b81526020808401356001600160401b038082111561595d575f80fd5b9085019036601f83011261596f575f80fd5b81358181111561598157615981615317565b8060051b9150615992848301615375565b81815291830184019184810190368411156159ab575f80fd5b938501935b838510156159d557843592506159c583615271565b82825293850193908501906159b0565b94860194909452509295945050505050565b5f602082840312156159f7575f80fd5b6116598261502c565b5f60208284031215615a10575f80fd5b813560ff81168114611659575f80fd5b5f6001600160401b038083168181036155e5576155e56155a6565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a8181602a850160208b016150d0565b865190830190615a9881602a840160208b016150d0565b60c087901b6001600160c01b031916602a9290910191820152615aca603282018660e01b6001600160e01b0319169052565b615ae3603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615b068184602088016150d0565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615b3c8184602089016150d0565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b778184602088016150d0565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d99380380615d9983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4c8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614f03565b610615565b005b348015610221575f80fd5b50610214610230366004614f3e565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614f03565b610858565b34801561028a575f80fd5b50610214610299366004614f55565b610863565b3480156102a9575f80fd5b506102146102b8366004614fa3565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614f3e565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614f03565b610e5b565b348015610378575f80fd5b50610214610387366004614fc4565b610e66565b348015610397575f80fd5b506102146103a6366004614fdd565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee36600461501b565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614f3e565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614f03565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614f3e565b611208565b348015610490575f80fd5b5061021461049f366004614fdd565b6112d3565b3480156104af575f80fd5b506102146104be366004614fc4565b6114ab565b6103f36104d1366004615045565b611634565b3480156104e1575f80fd5b506103f35f80516020615ba083398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614f3e565b611668565b34801561053a575f80fd5b506103f35f80516020615bc083398151915281565b34801561055a575f80fd5b50610214610569366004614f3e565b611851565b348015610579575f80fd5b50610214610588366004615099565b61198e565b6103f361059b366004614f3e565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614f3e565b611a9c565b6040516102579190615125565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f36106103660046151a5565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615bc083398151915293929190829060ff166005811115610697576106976150b0565b60058111156106a8576106a86150b0565b81526020016001820180546106bc90615210565b80601f01602080910402602001604051908101604052809291908181526020018280546106e890615210565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6150b0565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615242565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f4d565b6040518263ffffffff1660e01b81526004016108129190615250565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615262565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615bc08339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615262565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b30610956606085016040860161528d565b6001600160a01b03161461099957610974606084016040850161528d565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856152a8565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886152a8565b8363ffffffff168181106109e0576109e06152ed565b90506020028101906109f29190615301565b6109fb90615425565b80516040519192505f916008880191610a139161549e565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c9190600401615250565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c9161549e565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615262565b90508086600801835f0151604051610ae2919061549e565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646150b0565b021790555060208201516001820190610b7d90826154f3565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c229116856155c2565b8251604051919550610c339161549e565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c88906155d5565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836155f7565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611f9c565b604001516120b2565b90505f610cf78761223f565b90505f600282604051610d0a919061549e565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615262565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612419565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd76150b0565b14610df7578060405163170cc93360e21b815260040161063c9190615242565b6108528383612454565b5f805f80516020615ba083398151915260030154610e1f908461560e565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b6108528383836126ce565b610e6e6128ba565b5f80516020615ba08339815191525f80610e87846128f1565b91509150610e9482612419565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece6150b0565b03610ef3575f83815260088501602052604081208054919055610ef18282612c2f565b505b610f0981610f048460400151611192565b612c8d565b505050505b610f2460015f80516020615c0083398151915255565b50565b5f8181525f80516020615be08339815191526020526040808220815160e0810190925280545f80516020615ba083398151915293929190829060ff166003811115610f7457610f746150b0565b6003811115610f8557610f856150b0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b9050600183516003811115611012576110126150b0565b14611033578251604051633b0d540d60e21b815261063c919060040161562d565b600481516005811115611048576110486150b0565b0361105e5761105685612cb3565b505050505050565b5f8061107561106c89611f9c565b60400151612e9a565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b0384166155f7565b5f6111d382611a9c565b6080015192915050565b6111e88383836126ce565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615ba08339815191525f61122083611a9c565b5190506004816005811115611237576112376150b0565b14611257578060405163170cc93360e21b815260040161063c9190615242565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c2f565b6112db6128ba565b5f8181525f80516020615be08339815191526020526040808220815160e0810190925280545f80516020615ba083398151915293929190829060ff166003811115611328576113286150b0565b6003811115611339576113396150b0565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b26150b0565b146113d3578051604051633b0d540d60e21b815261063c919060040161562d565b60046113e28260400151611a9c565b5160058111156113f4576113f46150b0565b14611486575f61140385611f9c565b90505f806114148360400151612e9a565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612cb3565b50506114a760015f80516020615c0083398151915255565b5050565b5f80516020615bc08339815191525f806114d06114c785611f9c565b604001516130f0565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f8281526006840160205260409020805461151090615210565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a6150b0565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615242565b5f82815260068401602052604081206115a591614e57565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d6128ba565b611649848484346132ac565b905061166160015f80516020615c0083398151915255565b9392505050565b5f8181525f80516020615be08339815191526020526040808220815160e0810190925280545f80516020615ba083398151915293929190829060ff1660038111156116b5576116b56150b0565b60038111156116c6576116c66150b0565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f6150b0565b14158015611760575060038151600381111561175d5761175d6150b0565b14155b15611781578051604051633b0d540d60e21b815261063c919060040161562d565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151611f4d565b6040518263ffffffff1660e01b815260040161180a9190615250565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615262565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615bc0833981519152919061189890615210565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e26150b0565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615242565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e9190600401615647565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615262565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f8361347a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a746128ba565b611a7f82333461348b565b9050611a9760015f80516020615c0083398151915255565b919050565b611aa4614e8e565b5f8281525f80516020615c20833981519152602052604090819020815160e0810190925280545f80516020615bc0833981519152929190829060ff166005811115611af157611af16150b0565b6005811115611b0257611b026150b0565b8152602001600182018054611b1690615210565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4290615210565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615bc0833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e90869086906156d1565b90815260200160405180910390205491505092915050565b5f8381525f80516020615be08339815191526020526040808220815160e0810190925280545f80516020615ba08339815191529284929091829060ff166003811115611c9457611c946150b0565b6003811115611ca557611ca56150b0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d326150b0565b14611d53578251604051633b0d540d60e21b815261063c919060040161562d565b60208301516001600160a01b03163314611df6575f828152600585016020526040902054336001600160a01b0390911603611df0575f82815260058501602052604090205460a0820151611db791600160b01b90046001600160401b0316906156e0565b6001600160401b0316421015611deb5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611df6565b33611278565b600281516005811115611e0b57611e0b6150b0565b03611ee8578615611e2257611e208287612454565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611e5b918491611e569190615700565b613760565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611e9c846138b7565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611efd57611efd6150b0565b03611f3157611f0b836138b7565b5f898152600786016020526040902055611f2488612cb3565b6001945050505050611661565b805160405163170cc93360e21b815261063c9190600401615242565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612000573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612027919081019061572b565b915091508061204957604051636b2f19e960e01b815260040160405180910390fd5b81511561206f578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120ab576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f81516026146120e757815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b6002811015612136576120fe8160016157fd565b6121099060086155f7565b61ffff1684828151811061211f5761211f6152ed565b016020015160f81c901b91909117906001016120ea565b5061ffff8116156121605760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156121bb576121778160036157fd565b6121829060086155f7565b63ffffffff16856121948360026155c2565b815181106121a4576121a46152ed565b016020015160f81c901b9190911790600101612163565b5063ffffffff8116156121e157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612236576121f881601f6157fd565b6122039060086155f7565b8661220f8360066155c2565b8151811061221f5761221f6152ed565b016020015160f81c901b91909117906001016121e4565b50949350505050565b60605f8083356020850135601461225b8787016040890161528d565b61226860608901896152a8565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6122ee60608501856152a8565b90508110156120ab578161230560608601866152a8565b83818110612315576123156152ed565b90506020028101906123279190615301565b6123319080615810565b905061234060608701876152a8565b84818110612350576123506152ed565b90506020028101906123629190615301565b61236c9080615810565b61237960608901896152a8565b86818110612389576123896152ed565b905060200281019061239b9190615301565b6123a9906020810190615810565b6123b660608b018b6152a8565b888181106123c6576123c66152ed565b90506020028101906123d89190615301565b6123e990606081019060400161501b565b6040516020016123ff9796959493929190615852565b60408051601f1981840301815291905291506001016122e1565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561249f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124c6919081019061572b565b91509150806124e857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561252b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254f9190615262565b825114612575578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125b1576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806125c08460400151613a54565b915091508187146125e75760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615ba0833981519152906001600160401b0390811690831611156126a4575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26126c3565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615ba0833981519152816126e786613c45565b90506126f286612419565b61270157600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127265733611278565b5f86815260058301602052604090205460a082015161275591600160b01b90046001600160401b0316906156e0565b6001600160401b03168160c001516001600160401b0316101561279c5760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127b4576127ad8786612454565b90506127d2565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127f790611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612860573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128849190615262565b905080846008015f8a81526020019081526020015f205f8282546128a891906155c2565b90915550501515979650505050505050565b5f80516020615c008339815191528054600119016128eb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128fa614e8e565b5f80516020615bc08339815191525f806129166114c787611f9c565b91509150801561293d57604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561296e5761296e6150b0565b600581111561297f5761297f6150b0565b815260200160018201805461299390615210565b80601f01602080910402602001604051908101604052809291908181526020018280546129bf90615210565b8015612a0a5780601f106129e157610100808354040283529160200191612a0a565b820191905f5260205f20905b8154815290600101906020018083116129ed57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a7557612a756150b0565b14158015612a965750600181516005811115612a9357612a936150b0565b14155b15612ab757805160405163170cc93360e21b815261063c9190600401615242565b600381516005811115612acc57612acc6150b0565b03612ada5760048152612adf565b600581525b836008018160200151604051612af5919061549e565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b3957612b396150b0565b021790555060208201516001820190612b5290826154f3565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bf857612bf86150b0565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c7b575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613f29565b60015f80516020615c0083398151915255565b5f8181525f80516020615be08339815191526020526040808220815160e0810190925280545f80516020615ba083398151915293929190829060ff166003811115612d0057612d006150b0565b6003811115612d1157612d116150b0565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e3f575f84815260058701602052604090205461271090612df190600160a01b900461ffff16856155f7565b612dfb919061560e565b915081866008015f8681526020019081526020015f205f828254612e1f91906155c2565b90915550612e2f905082846157fd565b9050612e3f856020015182612c2f565b612e548560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ed157835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612f2057612ee88160016157fd565b612ef39060086155f7565b61ffff16868281518110612f0957612f096152ed565b016020015160f81c901b9190911790600101612ed4565b5061ffff811615612f4a5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612fa557612f618160036157fd565b612f6c9060086155f7565b63ffffffff1687612f7e8360026155c2565b81518110612f8e57612f8e6152ed565b016020015160f81c901b9190911790600101612f4d565b5063ffffffff8116600314612fcd57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561302257612fe481601f6157fd565b612fef9060086155f7565b88612ffb8360066155c2565b8151811061300b5761300b6152ed565b016020015160f81c901b9190911790600101612fd0565b505f805b60088110156130815761303a8160076157fd565b6130459060086155f7565b6001600160401b03168961305a8360266155c2565b8151811061306a5761306a6152ed565b016020015160f81c901b9190911790600101613026565b505f805b60088110156130e0576130998160076157fd565b6130a49060086155f7565b6001600160401b03168a6130b983602e6155c2565b815181106130c9576130c96152ed565b016020015160f81c901b9190911790600101613085565b5091989097509095509350505050565b5f80825160271461312657825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b60028110156131755761313d8160016157fd565b6131489060086155f7565b61ffff1685828151811061315e5761315e6152ed565b016020015160f81c901b9190911790600101613129565b5061ffff81161561319f5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131fa576131b68160036157fd565b6131c19060086155f7565b63ffffffff16866131d38360026155c2565b815181106131e3576131e36152ed565b016020015160f81c901b91909117906001016131a2565b5063ffffffff811660021461322257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132775761323981601f6157fd565b6132449060086155f7565b876132508360066155c2565b81518110613260576132606152ed565b016020015160f81c901b9190911790600101613225565b505f8660268151811061328c5761328c6152ed565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615ba083398151915290600160401b900461ffff9081169086161080613300575061271061ffff8616115b1561332457604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613360576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133725750806001015483115b156133935760405163222d164360e21b81526004810184905260240161063c565b825f61339e82610e01565b90505f6133ab8983613fbc565b905060405180608001604052806133bf3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b613482614534565b610f248161457f565b5f5f80516020615ba0833981519152816134a484610e01565b90505f6134b087611a9c565b90506134bb87612419565b6134db576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156134f0576134f06150b0565b1461351157805160405163170cc93360e21b815261063c9190600401615242565b5f82826080015161352291906156e0565b905083600201600a9054906101000a90046001600160401b0316826040015161354b91906158bb565b6001600160401b0316816001600160401b0316111561358857604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135948a84613760565b915091505f8a836040516020016135c292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff19166001836003811115613655576136556150b0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615c20833981519152602052604081206002015481905f80516020615bc083398151915290600160801b90046001600160401b03166137a885826145f3565b5f6137b287614816565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6138028a858b611f4d565b6040518263ffffffff1660e01b815260040161381e9190615250565b6020604051808303815f875af115801561383a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061385e9190615262565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615ba083398151915290505f6138d78460400151611a9c565b90505f6003825160058111156138ef576138ef6150b0565b148061390d575060048251600581111561390b5761390b6150b0565b145b1561391d575060c081015161395a565b600282516005811115613932576139326150b0565b0361393e57504261395a565b815160405163170cc93360e21b815261063c9190600401615242565b84608001516001600160401b0316816001600160401b03161161398157505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139a690611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4b9190615262565b95945050505050565b5f808251602e14613a8a57825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613ad957613aa18160016157fd565b613aac9060086155f7565b61ffff16858281518110613ac257613ac26152ed565b016020015160f81c901b9190911790600101613a8d565b5061ffff811615613b035760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b5e57613b1a8160036157fd565b613b259060086155f7565b63ffffffff1686613b378360026155c2565b81518110613b4757613b476152ed565b016020015160f81c901b9190911790600101613b06565b5063ffffffff811615613b8457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bd957613b9b81601f6157fd565b613ba69060086155f7565b87613bb28360066155c2565b81518110613bc257613bc26152ed565b016020015160f81c901b9190911790600101613b87565b505f805b6008811015613c3857613bf18160076157fd565b613bfc9060086155f7565b6001600160401b031688613c118360266155c2565b81518110613c2157613c216152ed565b016020015160f81c901b9190911790600101613bdd565b5090969095509350505050565b613c4d614e8e565b5f8281525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615bc083398151915293929190829060ff166005811115613c9a57613c9a6150b0565b6005811115613cab57613cab6150b0565b8152602001600182018054613cbf90615210565b80601f0160208091040260200160405190810160405280929190818152602001828054613ceb90615210565b8015613d365780601f10613d0d57610100808354040283529160200191613d36565b820191905f5260205f20905b815481529060010190602001808311613d1957829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613da457613da46150b0565b14613dd7575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615242565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e1b57613e1b6150b0565b021790555060208201516001820190613e3490826154f3565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ed28582613760565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f4c5760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f95576040519150601f19603f3d011682016040523d82523d5f602084013e613f9a565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661400057604051637fab81e560e01b815260040160405180910390fd5b5f80516020615bc08339815191524261401f606086016040870161501b565b6001600160401b0316111580614059575061403d6202a300426155c2565b61404d606086016040870161501b565b6001600160401b031610155b156140935761406e606085016040860161501b565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6140a86140a360608601866158e6565b61488b565b6140b86140a360808601866158e6565b60306140c76020860186615810565b9050146140f9576140db6020850185615810565b6040516326475b2f60e11b815261063c925060040190815260200190565b6141038480615810565b90505f03614130576141158480615810565b604051633e08a12560e11b815260040161063c9291906158fa565b5f6008820161413f8680615810565b60405161414d9291906156d1565b908152602001604051809103902054146141865761416b8480615810565b60405163a41f772f60e01b815260040161063c9291906158fa565b614190835f6145f3565b6040805160e08101909152815481525f90819061429c90602081016141b58980615810565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141fd908a018a615810565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161424660608a0160408b0161501b565b6001600160401b0316815260200161426160608a018a6158e6565b61426a90615928565b815260200161427c60808a018a6158e6565b61428590615928565b8152602001876001600160401b03168152506149f4565b5f828152600686016020526040902091935091506142ba82826154f3565b5081600884016142ca8880615810565b6040516142d89291906156d1565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614314908590600401615250565b6020604051808303815f875af1158015614330573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143549190615262565b6040805160e0810190915290915080600181526020016143748980615810565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115614403576144036150b0565b02179055506020820151600182019061441c90826154f3565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144ba8880615810565b6040516144c89291906156d1565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614506919061501b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661457d57604051631afcd79f60e31b815260040160405180910390fd5b565b614587614534565b61459081614be1565b614598614bfa565b610f24606082013560808301356145b560c0850160a0860161501b565b6145c560e0860160c087016159ef565b6145d6610100870160e08801615a08565b6101008701356145ee61014089016101208a0161528d565b614c0a565b5f80516020615bc08339815191525f6001600160401b038084169085161115614627576146208385615700565b9050614634565b6146318484615700565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614696575060018401548151614692916001600160401b0316906155c2565b8210155b156146bc576001600160401b0383166060820152818152604081015160208201526146db565b82816060018181516146ce91906156e0565b6001600160401b03169052505b60608101516146eb9060646158bb565b602082015160018601546001600160401b0392909216916147169190600160401b900460ff166155f7565b101561474657606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161476191906155c2565b9052506040810180516001600160401b03871691906147819083906157fd565b905250600184015460408201516064916147a691600160401b90910460ff16906155f7565b10156147cd578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c208339815191526020526040812060020180545f80516020615bc0833981519152919060089061486090600160401b90046001600160401b0316615a28565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148986020820182614fc4565b63ffffffff161580156148b857506148b360208201826152a8565b151590505b156148ff576148ca6020820182614fc4565b6148d760208301836152a8565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b61490c60208201826152a8565b905061491b6020830183614fc4565b63ffffffff161115614934576148ca6020820182614fc4565b60015b61494460208301836152a8565b90508110156114a75761495a60208301836152a8565b6149656001846157fd565b818110614974576149746152ed565b9050602002016020810190614989919061528d565b6001600160a01b031661499f60208401846152a8565b838181106149af576149af6152ed565b90506020020160208101906149c4919061528d565b6001600160a01b031610156149ec57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614937565b5f6060826040015151603014614a1d5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a5e988a986001989297929690959094909390929101615a43565b60405160208183030381529060405290505f5b84608001516020015151811015614ad057818560800151602001518281518110614a9d57614a9d6152ed565b6020026020010151604051602001614ab6929190615afd565b60408051601f198184030181529190529150600101614a71565b5060a0840151805160209182015151604051614af0938593929101615b33565b60405160208183030381529060405290505f5b8460a001516020015151811015614b6257818560a00151602001518281518110614b2f57614b2f6152ed565b6020026020010151604051602001614b48929190615afd565b60408051601f198184030181529190529150600101614b03565b5060c0840151604051614b79918391602001615b6e565b6040516020818303038152906040529050600281604051614b9a919061549e565b602060405180830381855afa158015614bb5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bd89190615262565b94909350915050565b614be9614534565b614bf1614d5f565b610f2481614d67565b614c02614534565b61457d614e4f565b614c12614534565b5f80516020615ba083398151915261ffff85161580614c36575061271061ffff8616115b15614c5a57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614c7e5760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614c915750600a60ff8516115b15614cb45760405163170db35960e31b815260ff8516600482015260240161063c565b825f03614cd45760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61457d614534565b614d6f614534565b80355f80516020615bc08339815191529081556014614d946060840160408501615a08565b60ff161180614db35750614dae6060830160408401615a08565b60ff16155b15614de757614dc86060830160408401615a08565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614df76060830160408401615a08565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e28604083016020840161501b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ca0614534565b508054614e6390615210565b5f825580601f10614e72575050565b601f0160209004905f5260205f2090810190610f249190614ecb565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614edf575f8155600101614ecc565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215614f15575f80fd5b833592506020840135614f2781614ee3565b9150614f3560408501614ef0565b90509250925092565b5f60208284031215614f4e575f80fd5b5035919050565b5f8060408385031215614f66575f80fd5b82356001600160401b03811115614f7b575f80fd5b830160808186031215614f8c575f80fd5b9150614f9a60208401614ef0565b90509250929050565b5f8060408385031215614fb4575f80fd5b82359150614f9a60208401614ef0565b5f60208284031215614fd4575f80fd5b61166182614ef0565b5f8060408385031215614fee575f80fd5b614ff783614ef0565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f6020828403121561502b575f80fd5b61166182615005565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615057575f80fd5b83356001600160401b0381111561506c575f80fd5b840160a0818703121561507d575f80fd5b925061508b60208501615034565b9150614f3560408501615005565b5f61014082840312156150aa575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106150d4576150d46150b0565b9052565b5f5b838110156150f25781810151838201526020016150da565b50505f910152565b5f81518084526151118160208601602086016150d8565b601f01601f19169290920160200192915050565b602081526151376020820183516150c4565b5f602083015160e060408401526151526101008401826150fa565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156151b6575f80fd5b82356001600160401b03808211156151cc575f80fd5b818501915085601f8301126151df575f80fd5b8135818111156151ed575f80fd5b8660208285010111156151fe575f80fd5b60209290920196919550909350505050565b600181811c9082168061522457607f821691505b6020821081036150aa57634e487b7160e01b5f52602260045260245ffd5b60208101610e5582846150c4565b602081525f61166160208301846150fa565b5f60208284031215615272575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f6020828403121561529d575f80fd5b813561166181615279565b5f808335601e198436030181126152bd575f80fd5b8301803591506001600160401b038211156152d6575f80fd5b6020019150600581901b36038213156138b0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615315575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156153555761535561531f565b60405290565b604080519081016001600160401b03811182821017156153555761535561531f565b604051601f8201601f191681016001600160401b03811182821017156153a5576153a561531f565b604052919050565b5f6001600160401b038211156153c5576153c561531f565b50601f01601f191660200190565b5f82601f8301126153e2575f80fd5b81356153f56153f0826153ad565b61537d565b818152846020838601011115615409575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615435575f80fd5b61543d615333565b82356001600160401b0380821115615453575f80fd5b61545f368387016153d3565b83526020850135915080821115615474575f80fd5b50615481368286016153d3565b60208301525061549360408401615005565b604082015292915050565b5f82516153158184602087016150d8565b601f82111561064557805f5260205f20601f840160051c810160208510156154d45750805b601f840160051c820191505b8181101561184a575f81556001016154e0565b81516001600160401b0381111561550c5761550c61531f565b6155208161551a8454615210565b846154af565b602080601f831160018114615553575f841561553c5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b8281101561558157888601518255948401946001909101908401615562565b508582101561559e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e556155ae565b5f63ffffffff8083168181036155ed576155ed6155ae565b6001019392505050565b8082028115828204841417610e5557610e556155ae565b5f8261562857634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615641576156416150b0565b91905290565b5f60208083525f845461565981615210565b806020870152604060018084165f811461567a5760018114615696576156c3565b60ff19851660408a0152604084151560051b8a010195506156c3565b895f5260205f205f5b858110156156ba5781548b820186015290830190880161569f565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120ab576120ab6155ae565b6001600160401b038281168282160390808211156120ab576120ab6155ae565b8051611a9781614ee3565b5f806040838503121561573c575f80fd5b82516001600160401b0380821115615752575f80fd5b9084019060608287031215615765575f80fd5b61576d615333565b8251815260208084015161578081615279565b82820152604084015183811115615795575f80fd5b80850194505087601f8501126157a9575f80fd5b835192506157b96153f0846153ad565b83815288828587010111156157cc575f80fd5b6157db848383018488016150d8565b806040840152508195506157f0818801615720565b9450505050509250929050565b81810381811115610e5557610e556155ae565b5f808335601e19843603018112615825575f80fd5b8301803591506001600160401b0382111561583e575f80fd5b6020019150368190038213156138b0575f80fd5b5f8851615863818460208d016150d8565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146158de576158de6155ae565b505092915050565b5f8235603e19833603018112615315575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615938575f80fd5b61594061535b565b61594983614ef0565b81526020808401356001600160401b0380821115615965575f80fd5b9085019036601f830112615977575f80fd5b8135818111156159895761598961531f565b8060051b915061599a84830161537d565b81815291830184019184810190368411156159b3575f80fd5b938501935b838510156159dd57843592506159cd83615279565b82825293850193908501906159b8565b94860194909452509295945050505050565b5f602082840312156159ff575f80fd5b61166182615034565b5f60208284031215615a18575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b038083168181036155ed576155ed6155ae565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a8981602a850160208b016150d8565b865190830190615aa081602a840160208b016150d8565b60c087901b6001600160c01b031916602a9290910191820152615ad2603282018660e01b6001600160e01b0319169052565b615aeb603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615b0e8184602088016150d8565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615b448184602089016150d8565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b7f8184602088016150d8565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index ef7716dbc..8820611b6 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -375,11 +375,11 @@ abstract contract PoSValidatorManager is * @param value Token value to convert. */ function valueToWeight(uint256 value) public view returns (uint64) { - uint64 weight = uint64(value / _getPoSValidatorManagerStorage()._weightToValueFactor); - if (weight == 0) { + uint256 weight = value / _getPoSValidatorManagerStorage()._weightToValueFactor; + if (weight == 0 || weight > type(uint64).max) { revert InvalidStakeAmount(value); } - return weight; + return uint64(weight); } /** diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 1c22694f4..ecb4ac4fa 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -62,6 +62,7 @@ Proof-of-Stake Validator management is provided by the abstract contract `PoSVal > The `weightToValueFactor` fields of the `PoSValidatorManagerSettings` passed to `PoSValidatorManager`'s `initialize` function sets the factor used to convert between the weight that the Validator is registered with on the P-Chain, and the value transferred to the contract as stake. This involves integer division, which may result in loss of precision. When selecting `weightToValueFactor`, it's important to make the following considerations: > 1. If `weightToValueFactor` is near the denomination of the asset, then staking amounts on the order of 1 unit of the asset may cause the converted weight to round down to 0. This may impose a larger-than-expected minimum stake amount. > 2. Staked amounts up to `weightValueFactor - 1` may be lost in the contract as dust, as the Validator's registered weight is used to calculate the original staked amount. +> 3. The Validator's weight is represented on the P-Chain as a `uint64`. `PoSValidatorManager` restricts values such that the calculated weight does not exceed the maximum value for that type. #### NativeTokenStakingManager diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 3b34c133f..9a9b34543 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1116,6 +1116,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.valueToWeight(1e11); } + function testValueToWeightExceedsUInt64Max() public { + // default weightToValueFactor is 1e12 + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.InvalidStakeAmount.selector, 1e40) + ); + posValidatorManager.valueToWeight(1e40); + } + function testValueToWeight() public view { uint64 w1 = posValidatorManager.valueToWeight(1e12); uint64 w2 = posValidatorManager.valueToWeight(1e18); From 6e28518c1a41f6d1cbe944905de1fae61ce8c047 Mon Sep 17 00:00:00 2001 From: Michael Kaplan <55204436+michaelkaplan13@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:53:14 -0400 Subject: [PATCH 23/35] Update ValidatorMessages.sol Signed-off-by: Michael Kaplan <55204436+michaelkaplan13@users.noreply.github.com> --- contracts/validator-manager/ValidatorMessages.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 4ba9d667d..ca836eb5a 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -166,7 +166,7 @@ library ValidatorMessages { // The approach below of encoding initialValidators using `abi.encodePacked` in a loop // was tested against pre-allocating the array and doing manual byte by byte packing and // it was found to be more gas efficient. - for (uint256 i; i < subnetConversionData.initialValidators.length; i++) { + for (uint256 i; i < subnetConversionData.initialValidators.length; ++i) { res = abi.encodePacked( res, uint32(subnetConversionData.initialValidators[i].nodeID.length), @@ -238,7 +238,7 @@ library ValidatorMessages { validationPeriod.remainingBalanceOwner.threshold, uint32(validationPeriod.remainingBalanceOwner.addresses.length) ); - for (uint256 i; i < validationPeriod.remainingBalanceOwner.addresses.length; i++) { + for (uint256 i; i < validationPeriod.remainingBalanceOwner.addresses.length; ++i) { res = abi.encodePacked(res, validationPeriod.remainingBalanceOwner.addresses[i]); } res = abi.encodePacked( @@ -246,7 +246,7 @@ library ValidatorMessages { validationPeriod.disableOwner.threshold, uint32(validationPeriod.disableOwner.addresses.length) ); - for (uint256 i; i < validationPeriod.disableOwner.addresses.length; i++) { + for (uint256 i; i < validationPeriod.disableOwner.addresses.length; ++i) { res = abi.encodePacked(res, validationPeriod.disableOwner.addresses[i]); } res = abi.encodePacked(res, validationPeriod.weight); From aacd51b4a03379af31c13b4ff31aeae32f665d7b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 22 Oct 2024 12:00:39 -0500 Subject: [PATCH 24/35] add examples --- contracts/validator-manager/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index ecb4ac4fa..40d6fece5 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -61,7 +61,9 @@ Proof-of-Stake Validator management is provided by the abstract contract `PoSVal > [!NOTE] > The `weightToValueFactor` fields of the `PoSValidatorManagerSettings` passed to `PoSValidatorManager`'s `initialize` function sets the factor used to convert between the weight that the Validator is registered with on the P-Chain, and the value transferred to the contract as stake. This involves integer division, which may result in loss of precision. When selecting `weightToValueFactor`, it's important to make the following considerations: > 1. If `weightToValueFactor` is near the denomination of the asset, then staking amounts on the order of 1 unit of the asset may cause the converted weight to round down to 0. This may impose a larger-than-expected minimum stake amount. +> - Ex: If USDC (denomination of 6) is used as the staking token and `weightToValueFactor` is 1e9, then any amount less than 1,000 USDC will round down to 0 and therefore be invalid. > 2. Staked amounts up to `weightValueFactor - 1` may be lost in the contract as dust, as the Validator's registered weight is used to calculate the original staked amount. +> - Ex: `value=1001` and `weightToValueFactor=1e3`. The resulting weight will be `1`. Converting the weight back to a value results in `value=1000`. > 3. The Validator's weight is represented on the P-Chain as a `uint64`. `PoSValidatorManager` restricts values such that the calculated weight does not exceed the maximum value for that type. #### NativeTokenStakingManager From f46d4499e5eb7b8e55eeb886dbf302f2dfc83e84 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 23 Oct 2024 12:52:54 -0400 Subject: [PATCH 25/35] Fix tests --- .../validator-manager/tests/ERC20TokenStakingManagerTests.t.sol | 1 + .../validator-manager/tests/NativeTokenStakingManagerTests.t.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index ccccf833b..78489315a 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -159,6 +159,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: minStakeDuration, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }), token diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index e5470cdc6..adbfb79bb 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -199,6 +199,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: minStakeDuration, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, rewardCalculator: IRewardCalculator(address(0)) }) ); From 2cfd71cddecdab6ad06ffa6de35f9dc4b1927b16 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 23 Oct 2024 13:57:53 -0400 Subject: [PATCH 26/35] Fix test names --- .../tests/ERC20TokenStakingManagerTests.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index 78489315a..a96100814 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -139,7 +139,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } - function testMaxStakeMultiplierOverLimit() public { + function testMinStakeDurationTooLow() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint64 minStakeDuration = DEFAULT_CHURN_PERIOD - 1; vm.expectRevert( @@ -166,7 +166,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } - function testInvalidMinimumStakeDuration() public { + function testMaxStakeMultiplierOverLimit() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; vm.expectRevert( From 9c098beb23fa11e56984e03ed187c7a3293c5974 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 24 Oct 2024 10:47:30 -0400 Subject: [PATCH 27/35] Check for churn period seconds to pass when delegator ends --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 11 ++++++ .../tests/PoSValidatorManagerTests.t.sol | 38 +++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 126411919..f75e57a52 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161613f38038061613f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ff28061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615210565b6104b3565b005b61021461022436600461524b565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615210565b6106f6565b610214610269366004615262565b610701565b61021461027c3660046152b0565b610c2b565b61029461028f36600461524b565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615210565b610cf9565b6102146102e93660046152d1565b610d04565b6103016102fc366004615311565b610dc5565b60405190815260200161023f565b61021461031d366004615376565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461539e565b611065565b61029461036036600461524b565b61109c565b6103015f81565b61021461037a366004615210565b6110b0565b610231603081565b61021461039536600461524b565b6110db565b6102146103a8366004615376565b6111a6565b6103016103bb3660046153b7565b61137e565b6102146103ce3660046152d1565b6113aa565b6103015f80516020615f4683398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b36600461524b565b611533565b6103015f80516020615f6683398151915281565b61021461044236600461524b565b61171c565b610231601481565b61046261045d36600461524b565b611859565b60405161023f919061544c565b6102946202a30081565b6103015f80516020615f2683398151915281565b61021461049b3660046154e0565b6119a8565b6103016104ae36600461551e565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615fc68339815191526020526040808220815160e0810190925280545f80516020615f6683398151915293929190829060ff166005811115610535576105356153d7565b6005811115610546576105466153d7565b815260200160018201805461055a90615589565b80601f016020809104026020016040519081016040528092919081815260200182805461058690615589565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c6153d7565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e3a565b6040518263ffffffff1660e01b81526004016106b091906155cf565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906155e1565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f668339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906155e1565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f460608501604086016155f8565b6001600160a01b0316146108375761081260608401604085016155f8565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615613565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615613565b8363ffffffff1681811061087e5761087e615658565b9050602002810190610890919061566c565b61089990615790565b80516040519192505f9160088801916108b191615809565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da91906004016155cf565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615809565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906155e1565b90508086600801835f01516040516109809190615809565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a026153d7565b021790555060208201516001820190610a1b908261585e565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561592d565b8251604051919550610ad191615809565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615940565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff1683615962565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e89565b60400151611f9f565b90505f610b958761212c565b90505f600282604051610ba89190615809565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906155e1565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612306565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c756153d7565b14610c95578060405163170cc93360e21b81526004016104da91906155c1565b6106f08383612341565b5f805f80516020615f4683398151915260030154610cbd9084615979565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f08383836125bb565b610d0c6127a7565b5f80516020615f468339815191525f80610d25846127de565b91509150610d3282612306565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c6153d7565b03610d91575f83815260088501602052604081208054919055610d8f8282612b1c565b505b610da781610da28460400151611065565b612b92565b505050505b610dc260015f80516020615fa683398151915255565b50565b5f610dce6127a7565b610dda85858585612bc8565b9050610df260015f80516020615fa683398151915255565b949350505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115610e4757610e476153d7565b6003811115610e5857610e586153d7565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee56153d7565b14610f06578251604051633b0d540d60e21b81526104da9190600401615998565b600481516005811115610f1b57610f1b6153d7565b03610f3157610f2985612da1565b505050505050565b5f80610f48610f3f89611e89565b60400151612f88565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b038416615962565b5f6110a682611859565b6080015192915050565b6110bb8383836125bb565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615f468339815191525f6110f383611859565b519050600481600581111561110a5761110a6153d7565b1461112a578060405163170cc93360e21b81526004016104da91906155c1565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612b1c565b6111ae6127a7565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff1660038111156111fb576111fb6153d7565b600381111561120c5761120c6153d7565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611285576112856153d7565b146112a6578051604051633b0d540d60e21b81526104da9190600401615998565b60046112b58260400151611859565b5160058111156112c7576112c76153d7565b14611359575f6112d685611e89565b90505f806112e78360400151612f88565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612da1565b505061137a60015f80516020615fa683398151915255565b5050565b5f6113876127a7565b6113928333846131de565b9050610cf360015f80516020615fa683398151915255565b5f80516020615f668339815191525f806113cf6113c685611e89565b604001516134b6565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f90615589565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff166005811115611459576114596153d7565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b5f82815260068401602052604081206114a49161515f565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115611580576115806153d7565b6003811115611591576115916153d7565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a6153d7565b1415801561162b5750600381516003811115611628576116286153d7565b14155b1561164c578051604051633b0d540d60e21b81526104da9190600401615998565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611e3a565b6040518263ffffffff1660e01b81526004016116d591906155cf565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171591906155e1565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615f66833981519152919061176390615589565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad6153d7565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161181991906004016159b2565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906155e1565b611861615196565b5f8281525f80516020615fc6833981519152602052604090819020815160e0810190925280545f80516020615f66833981519152929190829060ff1660058111156118ae576118ae6153d7565b60058111156118bf576118bf6153d7565b81526020016001820180546118d390615589565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff90615589565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a8484613672565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615f66833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca9086908690615a3c565b90815260200160405180910390205491505092915050565b5f8381525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f468339815191529284929091829060ff166003811115611b3057611b306153d7565b6003811115611b4157611b416153d7565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce6153d7565b14611bef578251604051633b0d540d60e21b81526104da9190600401615998565b60208301516001600160a01b03163314611c8b575f8281526005850160205260409020546001600160a01b03163314611c28573361114b565b5f82815260058501602052604090205460a0820151611c5791600160b01b90046001600160401b031690615a4b565b6001600160401b0316421015611c8b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca057611ca06153d7565b03611dce5760028401546080840151611cc2916001600160401b031690615a4b565b6001600160401b0316421015611cf65760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d0857611d068287612341565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d41918491611d3c9190615a6b565b61368c565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d82846137e3565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e339350505050565b600481516005811115611de357611de36153d7565b03611e1757611df1836137e3565b5f898152600786016020526040902055611e0a88612da1565b6001945050505050611e33565b805160405163170cc93360e21b81526104da91906004016155c1565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611eed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f149190810190615a96565b9150915080611f3657604051636b2f19e960e01b815260040160405180910390fd5b815115611f5c578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f98576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fd457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202357611feb816001615b68565b611ff6906008615962565b61ffff1684828151811061200c5761200c615658565b016020015160f81c901b9190911790600101611fd7565b5061ffff81161561204d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120a857612064816003615b68565b61206f906008615962565b63ffffffff168561208183600261592d565b8151811061209157612091615658565b016020015160f81c901b9190911790600101612050565b5063ffffffff8116156120ce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612123576120e581601f615b68565b6120f0906008615962565b866120fc83600661592d565b8151811061210c5761210c615658565b016020015160f81c901b91909117906001016120d1565b50949350505050565b60605f80833560208501356014612148878701604089016155f8565b6121556060890189615613565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121db6060850185615613565b9050811015611f9857816121f26060860186615613565b8381811061220257612202615658565b9050602002810190612214919061566c565b61221e9080615b7b565b905061222d6060870187615613565b8481811061223d5761223d615658565b905060200281019061224f919061566c565b6122599080615b7b565b6122666060890189615613565b8681811061227657612276615658565b9050602002810190612288919061566c565b612296906020810190615b7b565b6122a360608b018b615613565b888181106122b3576122b3615658565b90506020028101906122c5919061566c565b6122d690606081019060400161539e565b6040516020016122ec9796959493929190615bbd565b60408051601f1981840301815291905291506001016121ce565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561238c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123b39190810190615a96565b91509150806123d557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243c91906155e1565b825114612462578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561249e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f806124ad8460400151613980565b915091508187146124d45760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615f46833981519152906001600160401b039081169083161115612591575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125b0565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615f46833981519152816125d486613b71565b90506125df86612306565b6125ee57600192505050611e33565b5f8681526005830160205260409020546001600160a01b03163314612613573361114b565b5f86815260058301602052604090205460a082015161264291600160b01b90046001600160401b031690615a4b565b6001600160401b03168160c001516001600160401b031610156126895760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126a15761269a8786612341565b90506126bf565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126e490611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561274d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061277191906155e1565b905080846008015f8a81526020019081526020015f205f828254612795919061592d565b90915550501515979650505050505050565b5f80516020615fa68339815191528054600119016127d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e7615196565b5f80516020615f668339815191525f806128036113c687611e89565b91509150801561282a57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285b5761285b6153d7565b600581111561286c5761286c6153d7565b815260200160018201805461288090615589565b80601f01602080910402602001604051908101604052809291908181526020018280546128ac90615589565b80156128f75780601f106128ce576101008083540402835291602001916128f7565b820191905f5260205f20905b8154815290600101906020018083116128da57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612962576129626153d7565b141580156129835750600181516005811115612980576129806153d7565b14155b156129a457805160405163170cc93360e21b81526104da91906004016155c1565b6003815160058111156129b9576129b96153d7565b036129c757600481526129cc565b600581525b8360080181602001516040516129e29190615809565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2657612a266153d7565b021790555060208201516001820190612a3f908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae557612ae56153d7565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615f2683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b77575f80fd5b505af1158015612b89573d5f803e3d5ffd5b50505050505050565b5f80516020615f268339815191525461137a906001600160a01b03168383613e55565b60015f80516020615fa683398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615f4683398151915290600160401b900461ffff9081169086161080612c1c575061271061ffff8616115b15612c4057604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c7c576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c8e5750806001015483115b15612caf5760405163222d164360e21b8152600481018490526024016104da565b5f612cb984613eb4565b90505f612cc582610c9f565b90505f612cd28983613ed7565b90506040518060800160405280612ce63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115612dee57612dee6153d7565b6003811115612dff57612dff6153d7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612f2d575f84815260058701602052604090205461271090612edf90600160a01b900461ffff1685615962565b612ee99190615979565b915081866008015f8681526020019081526020015f205f828254612f0d919061592d565b90915550612f1d90508284615b68565b9050612f2d856020015182612b1c565b612f428560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612fbf57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b600281101561300e57612fd6816001615b68565b612fe1906008615962565b61ffff16868281518110612ff757612ff7615658565b016020015160f81c901b9190911790600101612fc2565b5061ffff8116156130385760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156130935761304f816003615b68565b61305a906008615962565b63ffffffff168761306c83600261592d565b8151811061307c5761307c615658565b016020015160f81c901b919091179060010161303b565b5063ffffffff81166003146130bb57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613110576130d281601f615b68565b6130dd906008615962565b886130e983600661592d565b815181106130f9576130f9615658565b016020015160f81c901b91909117906001016130be565b505f805b600881101561316f57613128816007615b68565b613133906008615962565b6001600160401b03168961314883602661592d565b8151811061315857613158615658565b016020015160f81c901b9190911790600101613114565b505f805b60088110156131ce57613187816007615b68565b613192906008615962565b6001600160401b03168a6131a783602e61592d565b815181106131b7576131b7615658565b016020015160f81c901b9190911790600101613173565b5091989097509095509350505050565b5f5f80516020615f46833981519152816131fa61028f85613eb4565b90505f61320687611859565b905061321187612306565b613231576040516330efa98b60e01b8152600481018890526024016104da565b600281516005811115613246576132466153d7565b1461326757805160405163170cc93360e21b81526104da91906004016155c1565b5f8282608001516132789190615a4b565b905083600201600a9054906101000a90046001600160401b031682604001516132a19190615c26565b6001600160401b0316816001600160401b031611156132de57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132ea8a8461368c565b915091505f8a8360405160200161331892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156133ab576133ab6153d7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146134ec57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b600281101561353b57613503816001615b68565b61350e906008615962565b61ffff1685828151811061352457613524615658565b016020015160f81c901b91909117906001016134ef565b5061ffff8116156135655760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156135c05761357c816003615b68565b613587906008615962565b63ffffffff168661359983600261592d565b815181106135a9576135a9615658565b016020015160f81c901b9190911790600101613568565b5063ffffffff81166002146135e857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561363d576135ff81601f615b68565b61360a906008615962565b8761361683600661592d565b8151811061362657613626615658565b016020015160f81c901b91909117906001016135eb565b505f8660268151811061365257613652615658565b016020015191976001600160f81b03199092161515965090945050505050565b61367a61444f565b6136838261449a565b61137a8161450e565b5f8281525f80516020615fc6833981519152602052604081206002015481905f80516020615f6683398151915290600160801b90046001600160401b03166136d48582614576565b5f6136de87614799565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61372e8a858b611e3a565b6040518263ffffffff1660e01b815260040161374a91906155cf565b6020604051808303815f875af1158015613766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061378a91906155e1565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615f4683398151915290505f6138038460400151611859565b90505f60038251600581111561381b5761381b6153d7565b14806138395750600482516005811115613837576138376153d7565b145b15613849575060c0810151613886565b60028251600581111561385e5761385e6153d7565b0361386a575042613886565b815160405163170cc93360e21b81526104da91906004016155c1565b84608001516001600160401b0316816001600160401b0316116138ad57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138d290611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613953573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397791906155e1565b95945050505050565b5f808251602e146139b657825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613a05576139cd816001615b68565b6139d8906008615962565b61ffff168582815181106139ee576139ee615658565b016020015160f81c901b91909117906001016139b9565b5061ffff811615613a2f5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a8a57613a46816003615b68565b613a51906008615962565b63ffffffff1686613a6383600261592d565b81518110613a7357613a73615658565b016020015160f81c901b9190911790600101613a32565b5063ffffffff811615613ab057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b0557613ac781601f615b68565b613ad2906008615962565b87613ade83600661592d565b81518110613aee57613aee615658565b016020015160f81c901b9190911790600101613ab3565b505f805b6008811015613b6457613b1d816007615b68565b613b28906008615962565b6001600160401b031688613b3d83602661592d565b81518110613b4d57613b4d615658565b016020015160f81c901b9190911790600101613b09565b5090969095509350505050565b613b79615196565b5f8281525f80516020615fc68339815191526020526040808220815160e0810190925280545f80516020615f6683398151915293929190829060ff166005811115613bc657613bc66153d7565b6005811115613bd757613bd76153d7565b8152602001600182018054613beb90615589565b80601f0160208091040260200160405190810160405280929190818152602001828054613c1790615589565b8015613c625780601f10613c3957610100808354040283529160200191613c62565b820191905f5260205f20905b815481529060010190602001808311613c4557829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613cd057613cd06153d7565b14613d03575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d4757613d476153d7565b021790555060208201516001820190613d60908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613dfe858261368c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061480e565b5f610cf3825f80516020615f26833981519152546001600160a01b03169061486f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f1b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615f6683398151915242613f3a606086016040870161539e565b6001600160401b0316111580613f745750613f586202a3004261592d565b613f68606086016040870161539e565b6001600160401b031610155b15613fae57613f89606085016040860161539e565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613fc3613fbe6060860186615c51565b6149c8565b613fd3613fbe6080860186615c51565b6030613fe26020860186615b7b565b90501461401457613ff66020850185615b7b565b6040516326475b2f60e11b81526104da925060040190815260200190565b61401e8480615b7b565b90505f0361404b576140308480615b7b565b604051633e08a12560e11b81526004016104da929190615c65565b5f6008820161405a8680615b7b565b604051614068929190615a3c565b908152602001604051809103902054146140a1576140868480615b7b565b60405163a41f772f60e01b81526004016104da929190615c65565b6140ab835f614576565b6040805160e08101909152815481525f9081906141b790602081016140d08980615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614118908a018a615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161416160608a0160408b0161539e565b6001600160401b0316815260200161417c60608a018a615c51565b61418590615c93565b815260200161419760808a018a615c51565b6141a090615c93565b8152602001876001600160401b0316815250614b31565b5f828152600686016020526040902091935091506141d5828261585e565b5081600884016141e58880615b7b565b6040516141f3929190615a3c565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061422f9085906004016155cf565b6020604051808303815f875af115801561424b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426f91906155e1565b6040805160e08101909152909150806001815260200161428f8980615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561431e5761431e6153d7565b021790555060208201516001820190614337908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143d58880615b7b565b6040516143e3929190615a3c565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614421919061539e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661449857604051631afcd79f60e31b815260040160405180910390fd5b565b6144a261444f565b6144ab81614d1e565b6144b3614d37565b610dc2606082013560808301356144d060c0850160a0860161539e565b6144e060e0860160c08701615d5a565b6144f1610100870160e08801615d73565b61010087013561450961014089016101208a016155f8565b614d47565b61451661444f565b5f80516020615f268339815191526001600160a01b03821661455657604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615f668339815191525f6001600160401b0380841690851611156145aa576145a38385615a6b565b90506145b7565b6145b48484615a6b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614619575060018401548151614615916001600160401b03169061592d565b8210155b1561463f576001600160401b03831660608201528181526040810151602082015261465e565b82816060018181516146519190615a4b565b6001600160401b03169052505b606081015161466e906064615c26565b602082015160018601546001600160401b0392909216916146999190600160401b900460ff16615962565b10156146c957606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146e4919061592d565b9052506040810180516001600160401b0387169190614704908390615b68565b9052506001840154604082015160649161472991600160401b90910460ff1690615962565b1015614750578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615fc68339815191526020526040812060020180545f80516020615f6683398151915291906008906147e390600160401b90046001600160401b0316615d93565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6148226001600160a01b03841683614f03565b905080515f141580156148465750808060200190518101906148449190615dae565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156148b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148d991906155e1565b90506148f06001600160a01b038516333086614f10565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614934573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061495891906155e1565b90508181116149be5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139778282615b68565b6149d560208201826152d1565b63ffffffff161580156149f557506149f06020820182615613565b151590505b15614a3c57614a0760208201826152d1565b614a146020830183615613565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614a496020820182615613565b9050614a5860208301836152d1565b63ffffffff161115614a7157614a0760208201826152d1565b60015b614a816020830183615613565b905081101561137a57614a976020830183615613565b614aa2600184615b68565b818110614ab157614ab1615658565b9050602002016020810190614ac691906155f8565b6001600160a01b0316614adc6020840184615613565b83818110614aec57614aec615658565b9050602002016020810190614b0191906155f8565b6001600160a01b03161015614b2957604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a74565b5f6060826040015151603014614b5a5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b9b988a986001989297929690959094909390929101615dc9565b60405160208183030381529060405290505f5b84608001516020015151811015614c0d57818560800151602001518281518110614bda57614bda615658565b6020026020010151604051602001614bf3929190615e83565b60408051601f198184030181529190529150600101614bae565b5060a0840151805160209182015151604051614c2d938593929101615eb9565b60405160208183030381529060405290505f5b8460a001516020015151811015614c9f57818560a00151602001518281518110614c6c57614c6c615658565b6020026020010151604051602001614c85929190615e83565b60408051601f198184030181529190529150600101614c40565b5060c0840151604051614cb6918391602001615ef4565b6040516020818303038152906040529050600281604051614cd79190615809565b602060405180830381855afa158015614cf2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d1591906155e1565b94909350915050565b614d2661444f565b614d2e614f49565b610dc281614f51565b614d3f61444f565b614498615039565b614d4f61444f565b5f80516020615f4683398151915261ffff85161580614d73575061271061ffff8616115b15614d9757604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614dbb5760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614dce5750600a60ff8516115b15614df15760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614e58576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614e785760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3383835f615041565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e82565b61449861444f565b614f5961444f565b80355f80516020615f668339815191529081556014614f7e6060840160408501615d73565b60ff161180614f9d5750614f986060830160408401615d73565b60ff16155b15614fd157614fb26060830160408401615d73565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614fe16060830160408401615d73565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615012604083016020840161539e565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612bb561444f565b6060814710156150665760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b031684866040516150819190615809565b5f6040518083038185875af1925050503d805f81146150bb576040519150601f19603f3d011682016040523d82523d5f602084013e6150c0565b606091505b50915091506150d08683836150da565b9695505050505050565b6060826150ef576150ea82615136565b611e33565b815115801561510657506001600160a01b0384163b155b1561512f57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e33565b8051156151465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461516b90615589565b5f825580601f1061517a575050565b601f0160209004905f5260205f2090810190610dc291906151d3565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156151e7575f81556001016151d4565b5090565b8015158114610dc2575f80fd5b803563ffffffff8116811461520b575f80fd5b919050565b5f805f60608486031215615222575f80fd5b833592506020840135615234816151eb565b9150615242604085016151f8565b90509250925092565b5f6020828403121561525b575f80fd5b5035919050565b5f8060408385031215615273575f80fd5b82356001600160401b03811115615288575f80fd5b830160808186031215615299575f80fd5b91506152a7602084016151f8565b90509250929050565b5f80604083850312156152c1575f80fd5b823591506152a7602084016151f8565b5f602082840312156152e1575f80fd5b611e33826151f8565b803561ffff8116811461520b575f80fd5b80356001600160401b038116811461520b575f80fd5b5f805f8060808587031215615324575f80fd5b84356001600160401b03811115615339575f80fd5b850160a0818803121561534a575f80fd5b9350615358602086016152ea565b9250615366604086016152fb565b9396929550929360600135925050565b5f8060408385031215615387575f80fd5b615390836151f8565b946020939093013593505050565b5f602082840312156153ae575f80fd5b611e33826152fb565b5f80604083850312156153c8575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106153fb576153fb6153d7565b9052565b5f5b83811015615419578181015183820152602001615401565b50505f910152565b5f81518084526154388160208601602086016153ff565b601f01601f19169290920160200192915050565b6020815261545e6020820183516153eb565b5f602083015160e06040840152615479610100840182615421565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f808284036101608112156154f3575f80fd5b61014080821215615502575f80fd5b8493508301359050615513816154cc565b809150509250929050565b5f806020838503121561552f575f80fd5b82356001600160401b0380821115615545575f80fd5b818501915085601f830112615558575f80fd5b813581811115615566575f80fd5b866020828501011115615577575f80fd5b60209290920196919550909350505050565b600181811c9082168061559d57607f821691505b6020821081036155bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf382846153eb565b602081525f611e336020830184615421565b5f602082840312156155f1575f80fd5b5051919050565b5f60208284031215615608575f80fd5b8135611e33816154cc565b5f808335601e19843603018112615628575f80fd5b8301803591506001600160401b03821115615641575f80fd5b6020019150600581901b36038213156137dc575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615680575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156156c0576156c061568a565b60405290565b604080519081016001600160401b03811182821017156156c0576156c061568a565b604051601f8201601f191681016001600160401b03811182821017156157105761571061568a565b604052919050565b5f6001600160401b038211156157305761573061568a565b50601f01601f191660200190565b5f82601f83011261574d575f80fd5b813561576061575b82615718565b6156e8565b818152846020838601011115615774575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156157a0575f80fd5b6157a861569e565b82356001600160401b03808211156157be575f80fd5b6157ca3683870161573e565b835260208501359150808211156157df575f80fd5b506157ec3682860161573e565b6020830152506157fe604084016152fb565b604082015292915050565b5f82516156808184602087016153ff565b601f8211156104e357805f5260205f20601f840160051c8101602085101561583f5750805b601f840160051c820191505b81811015611715575f815560010161584b565b81516001600160401b038111156158775761587761568a565b61588b816158858454615589565b8461581a565b602080601f8311600181146158be575f84156158a75750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b828110156158ec578886015182559484019460019091019084016158cd565b508582101561590957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615919565b5f63ffffffff80831681810361595857615958615919565b6001019392505050565b8082028115828204841417610cf357610cf3615919565b5f8261599357634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106159ac576159ac6153d7565b91905290565b5f60208083525f84546159c481615589565b806020870152604060018084165f81146159e55760018114615a0157615a2e565b60ff19851660408a0152604084151560051b8a01019550615a2e565b895f5260205f205f5b85811015615a255781548b8201860152908301908801615a0a565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f9857611f98615919565b6001600160401b03828116828216039080821115611f9857611f98615919565b805161520b816151eb565b5f8060408385031215615aa7575f80fd5b82516001600160401b0380821115615abd575f80fd5b9084019060608287031215615ad0575f80fd5b615ad861569e565b82518152602080840151615aeb816154cc565b82820152604084015183811115615b00575f80fd5b80850194505087601f850112615b14575f80fd5b83519250615b2461575b84615718565b8381528882858701011115615b37575f80fd5b615b46848383018488016153ff565b80604084015250819550615b5b818801615a8b565b9450505050509250929050565b81810381811115610cf357610cf3615919565b5f808335601e19843603018112615b90575f80fd5b8301803591506001600160401b03821115615ba9575f80fd5b6020019150368190038213156137dc575f80fd5b5f8851615bce818460208d016153ff565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615c4957615c49615919565b505092915050565b5f8235603e19833603018112615680575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ca3575f80fd5b615cab6156c6565b615cb4836151f8565b81526020808401356001600160401b0380821115615cd0575f80fd5b9085019036601f830112615ce2575f80fd5b813581811115615cf457615cf461568a565b8060051b9150615d058483016156e8565b8181529183018401918481019036841115615d1e575f80fd5b938501935b83851015615d485784359250615d38836154cc565b8282529385019390850190615d23565b94860194909452509295945050505050565b5f60208284031215615d6a575f80fd5b611e33826152ea565b5f60208284031215615d83575f80fd5b813560ff81168114611e33575f80fd5b5f6001600160401b0380831681810361595857615958615919565b5f60208284031215615dbe575f80fd5b8151611e33816151eb565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e0f81602a850160208b016153ff565b865190830190615e2681602a840160208b016153ff565b60c087901b6001600160c01b031916602a9290910191820152615e58603282018660e01b6001600160e01b0319169052565b615e71603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615e948184602088016153ff565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615eca8184602089016153ff565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f058184602088016153ff565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516161fe3803806161fe83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160b18061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f3660046152cf565b6104b3565b005b61021461022436600461530a565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b6102146102563660046152cf565b6106f6565b610214610269366004615321565b610701565b61021461027c36600461536f565b610c2b565b61029461028f36600461530a565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d63660046152cf565b610cf9565b6102146102e9366004615390565b610d04565b6103016102fc3660046153d0565b610dc5565b60405190815260200161023f565b61021461031d366004615435565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461545d565b611065565b61029461036036600461530a565b61109c565b6103015f81565b61021461037a3660046152cf565b6110b0565b610231603081565b61021461039536600461530a565b6110db565b6102146103a8366004615435565b6111a6565b6103016103bb366004615476565b6113cf565b6102146103ce366004615390565b6113fb565b6103015f8051602061600583398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b36600461530a565b611584565b6103015f8051602061602583398151915281565b61021461044236600461530a565b61176d565b610231601481565b61046261045d36600461530a565b6118aa565b60405161023f919061550b565b6102946202a30081565b6103015f80516020615fe583398151915281565b61021461049b36600461559f565b6119f9565b6103016104ae3660046155dd565b611ad8565b6104be838383611b33565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160858339815191526020526040808220815160e0810190925280545f8051602061602583398151915293929190829060ff16600581111561053557610535615496565b600581111561054657610546615496565b815260200160018201805461055a90615648565b80601f016020809104026020016040519081016040528092919081815260200182805461058690615648565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615496565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615680565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611ef9565b6040518263ffffffff1660e01b81526004016106b0919061568e565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906156a0565b50505050565b6106f0838383611b33565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206160258339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906156a0565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f460608501604086016156b7565b6001600160a01b0316146108375761081260608401604085016156b7565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f61084560608501856156d2565b905090505f805b828163ffffffff161015610b2d575f61086860608801886156d2565b8363ffffffff1681811061087e5761087e615717565b9050602002810190610890919061572b565b6108999061584f565b80516040519192505f9160088801916108b1916158c8565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da919060040161568e565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a916158c8565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906156a0565b90508086600801835f015160405161098091906158c8565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615496565b021790555060208201516001820190610a1b908261591d565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac09116856159ec565b8251604051919550610ad1916158c8565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906159ff565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff1683615a21565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611f48565b6040015161205e565b90505f610b95876121eb565b90505f600282604051610ba891906158c8565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906156a0565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c34826123c5565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e836118aa565b5190506002816005811115610c7557610c75615496565b14610c95578060405163170cc93360e21b81526004016104da9190615680565b6106f08383612400565b5f805f8051602061600583398151915260030154610cbd9084615a38565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f083838361267a565b610d0c612866565b5f805160206160058339815191525f80610d258461289d565b91509150610d32826123c5565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c615496565b03610d91575f83815260088501602052604081208054919055610d8f8282612bdb565b505b610da781610da28460400151611065565b612c51565b505050505b610dc260015f8051602061606583398151915255565b50565b5f610dce612866565b610dda85858585612c87565b9050610df260015f8051602061606583398151915255565b949350505050565b5f8181525f805160206160458339815191526020526040808220815160e0810190925280545f8051602061600583398151915293929190829060ff166003811115610e4757610e47615496565b6003811115610e5857610e58615496565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece826118aa565b9050600183516003811115610ee557610ee5615496565b14610f06578251604051633b0d540d60e21b81526104da9190600401615a57565b600481516005811115610f1b57610f1b615496565b03610f3157610f2985612e60565b505050505050565b5f80610f48610f3f89611f48565b60400151613047565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b038416615a21565b5f6110a6826118aa565b6080015192915050565b6110bb83838361267a565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f805160206160058339815191525f6110f3836118aa565b519050600481600581111561110a5761110a615496565b1461112a578060405163170cc93360e21b81526004016104da9190615680565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612bdb565b6111ae612866565b5f8181525f805160206160458339815191526020526040808220815160e0810190925280545f8051602061600583398151915293929190829060ff1660038111156111fb576111fb615496565b600381111561120c5761120c615496565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128557611285615496565b146112a6578051604051633b0d540d60e21b81526104da9190600401615a57565b600282015460808201516112c3916001600160401b031690615a71565b6001600160401b03164210156112f75760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600461130682604001516118aa565b51600581111561131857611318615496565b146113aa575f61132785611f48565b90505f806113388360400151613047565b5091509150818460400151146113645760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b031611156113a657604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b6113b383612e60565b50506113cb60015f8051602061606583398151915255565b5050565b5f6113d8612866565b6113e383338461329d565b9050610cf360015f8051602061606583398151915255565b5f805160206160258339815191525f8061142061141785611f48565b60400151613575565b915091508061144657604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461146090615648565b90505f036114845760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff1660058111156114aa576114aa615496565b146114dd575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615680565b5f82815260068401602052604081206114f59161521e565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206160458339815191526020526040808220815160e0810190925280545f8051602061600583398151915293929190829060ff1660038111156115d1576115d1615496565b60038111156115e2576115e2615496565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561165b5761165b615496565b1415801561167c575060038151600381111561167957611679615496565b14155b1561169d578051604051633b0d540d60e21b81526104da9190600401615a57565b5f6116ab82604001516118aa565b905080606001516001600160401b03165f036116dd576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb61170a846040015184606001518560800151611ef9565b6040518263ffffffff1660e01b8152600401611726919061568e565b6020604051808303815f875af1158015611742573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176691906156a0565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061602583398151915291906117b490615648565b90505f036117d85760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117fe576117fe615496565b14611831575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615680565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161186a9190600401615a91565b6020604051808303815f875af1158015611886573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906156a0565b6118b2615255565b5f8281525f80516020616085833981519152602052604090819020815160e0810190925280545f80516020616025833981519152929190829060ff1660058111156118ff576118ff615496565b600581111561191057611910615496565b815260200160018201805461192490615648565b80601f016020809104026020016040519081016040528092919081815260200182805461195090615648565b801561199b5780601f106119725761010080835404028352916020019161199b565b820191905f5260205f20905b81548152906001019060200180831161197e57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a42575080546001600160401b03808416911610155b15611a605760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a8b8484613731565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020616025833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b1b9086908690615b1b565b90815260200160405180910390205491505092915050565b5f8381525f805160206160458339815191526020526040808220815160e0810190925280545f805160206160058339815191529284929091829060ff166003811115611b8157611b81615496565b6003811115611b9257611b92615496565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c08826118aa565b9050600283516003811115611c1f57611c1f615496565b14611c40578251604051633b0d540d60e21b81526104da9190600401615a57565b60208301516001600160a01b03163314611cdc575f8281526005850160205260409020546001600160a01b03163314611c79573361114b565b5f82815260058501602052604090205460a0820151611ca891600160b01b90046001600160401b031690615a71565b6001600160401b0316421015611cdc5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611cf157611cf1615496565b03611e1f5760028401546080840151611d13916001600160401b031690615a71565b6001600160401b0316421015611d475760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d5957611d578287612400565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d92918491611d8d9190615b2a565b61374b565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611dd3846138a2565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611ef29350505050565b600481516005811115611e3457611e34615496565b03611ed6577fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03168360800151611e739190615a71565b6001600160401b0316421015611ea75760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611eb0836138a2565b5f898152600786016020526040902055611ec988612e60565b6001945050505050611ef2565b805160405163170cc93360e21b81526104da9190600401615680565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fac573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fd39190810190615b55565b9150915080611ff557604051636b2f19e960e01b815260040160405180910390fd5b81511561201b578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615612057576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f815160261461209357815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b60028110156120e2576120aa816001615c27565b6120b5906008615a21565b61ffff168482815181106120cb576120cb615717565b016020015160f81c901b9190911790600101612096565b5061ffff81161561210c5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561216757612123816003615c27565b61212e906008615a21565b63ffffffff16856121408360026159ec565b8151811061215057612150615717565b016020015160f81c901b919091179060010161210f565b5063ffffffff81161561218d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121e2576121a481601f615c27565b6121af906008615a21565b866121bb8360066159ec565b815181106121cb576121cb615717565b016020015160f81c901b9190911790600101612190565b50949350505050565b60605f80833560208501356014612207878701604089016156b7565b61221460608901896156d2565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61229a60608501856156d2565b905081101561205757816122b160608601866156d2565b838181106122c1576122c1615717565b90506020028101906122d3919061572b565b6122dd9080615c3a565b90506122ec60608701876156d2565b848181106122fc576122fc615717565b905060200281019061230e919061572b565b6123189080615c3a565b61232560608901896156d2565b8681811061233557612335615717565b9050602002810190612347919061572b565b612355906020810190615c3a565b61236260608b018b6156d2565b8881811061237257612372615717565b9050602002810190612384919061572b565b61239590606081019060400161545d565b6040516020016123ab9796959493929190615c7c565b60408051601f19818403018152919052915060010161228d565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561244b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124729190810190615b55565b915091508061249457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fb91906156a0565b825114612521578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561255d576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061256c8460400151613a3f565b915091508187146125935760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020616005833981519152906001600160401b039081169083161115612650575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261266f565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206160058339815191528161269386613c30565b905061269e866123c5565b6126ad57600192505050611ef2565b5f8681526005830160205260409020546001600160a01b031633146126d2573361114b565b5f86815260058301602052604090205460a082015161270191600160b01b90046001600160401b031690615a71565b6001600160401b03168160c001516001600160401b031610156127485760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f8515612760576127598786612400565b905061277e565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127a390611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561280c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061283091906156a0565b905080846008015f8a81526020019081526020015f205f82825461285491906159ec565b90915550501515979650505050505050565b5f8051602061606583398151915280546001190161289757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128a6615255565b5f805160206160258339815191525f806128c261141787611f48565b9150915080156128e957604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561291a5761291a615496565b600581111561292b5761292b615496565b815260200160018201805461293f90615648565b80601f016020809104026020016040519081016040528092919081815260200182805461296b90615648565b80156129b65780601f1061298d576101008083540402835291602001916129b6565b820191905f5260205f20905b81548152906001019060200180831161299957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a2157612a21615496565b14158015612a425750600181516005811115612a3f57612a3f615496565b14155b15612a6357805160405163170cc93360e21b81526104da9190600401615680565b600381516005811115612a7857612a78615496565b03612a865760048152612a8b565b600581525b836008018160200151604051612aa191906158c8565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612ae557612ae5615496565b021790555060208201516001820190612afe908261591d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ba457612ba4615496565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615fe583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c36575f80fd5b505af1158015612c48573d5f803e3d5ffd5b50505050505050565b5f80516020615fe5833981519152546113cb906001600160a01b03168383613f14565b60015f8051602061606583398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061600583398151915290600160401b900461ffff9081169086161080612cdb575061271061ffff8616115b15612cff57604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612d3b576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612d4d5750806001015483115b15612d6e5760405163222d164360e21b8152600481018490526024016104da565b5f612d7884613f73565b90505f612d8482610c9f565b90505f612d918983613f96565b90506040518060800160405280612da53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f805160206160458339815191526020526040808220815160e0810190925280545f8051602061600583398151915293929190829060ff166003811115612ead57612ead615496565b6003811115612ebe57612ebe615496565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612fec575f84815260058701602052604090205461271090612f9e90600160a01b900461ffff1685615a21565b612fa89190615a38565b915081866008015f8681526020019081526020015f205f828254612fcc91906159ec565b90915550612fdc90508284615c27565b9050612fec856020015182612bdb565b6130018560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461307e57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b60028110156130cd57613095816001615c27565b6130a0906008615a21565b61ffff168682815181106130b6576130b6615717565b016020015160f81c901b9190911790600101613081565b5061ffff8116156130f75760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156131525761310e816003615c27565b613119906008615a21565b63ffffffff168761312b8360026159ec565b8151811061313b5761313b615717565b016020015160f81c901b91909117906001016130fa565b5063ffffffff811660031461317a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131cf5761319181601f615c27565b61319c906008615a21565b886131a88360066159ec565b815181106131b8576131b8615717565b016020015160f81c901b919091179060010161317d565b505f805b600881101561322e576131e7816007615c27565b6131f2906008615a21565b6001600160401b0316896132078360266159ec565b8151811061321757613217615717565b016020015160f81c901b91909117906001016131d3565b505f805b600881101561328d57613246816007615c27565b613251906008615a21565b6001600160401b03168a61326683602e6159ec565b8151811061327657613276615717565b016020015160f81c901b9190911790600101613232565b5091989097509095509350505050565b5f5f80516020616005833981519152816132b961028f85613f73565b90505f6132c5876118aa565b90506132d0876123c5565b6132f0576040516330efa98b60e01b8152600481018890526024016104da565b60028151600581111561330557613305615496565b1461332657805160405163170cc93360e21b81526104da9190600401615680565b5f8282608001516133379190615a71565b905083600201600a9054906101000a90046001600160401b031682604001516133609190615ce5565b6001600160401b0316816001600160401b0316111561339d57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806133a98a8461374b565b915091505f8a836040516020016133d792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561346a5761346a615496565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135ab57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156135fa576135c2816001615c27565b6135cd906008615a21565b61ffff168582815181106135e3576135e3615717565b016020015160f81c901b91909117906001016135ae565b5061ffff8116156136245760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561367f5761363b816003615c27565b613646906008615a21565b63ffffffff16866136588360026159ec565b8151811061366857613668615717565b016020015160f81c901b9190911790600101613627565b5063ffffffff81166002146136a757604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156136fc576136be81601f615c27565b6136c9906008615a21565b876136d58360066159ec565b815181106136e5576136e5615717565b016020015160f81c901b91909117906001016136aa565b505f8660268151811061371157613711615717565b016020015191976001600160f81b03199092161515965090945050505050565b61373961450e565b61374282614559565b6113cb816145cd565b5f8281525f80516020616085833981519152602052604081206002015481905f8051602061602583398151915290600160801b90046001600160401b03166137938582614635565b5f61379d87614858565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137ed8a858b611ef9565b6040518263ffffffff1660e01b8152600401613809919061568e565b6020604051808303815f875af1158015613825573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061384991906156a0565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061600583398151915290505f6138c284604001516118aa565b90505f6003825160058111156138da576138da615496565b14806138f857506004825160058111156138f6576138f6615496565b145b15613908575060c0810151613945565b60028251600581111561391d5761391d615496565b03613929575042613945565b815160405163170cc93360e21b81526104da9190600401615680565b84608001516001600160401b0316816001600160401b03161161396c57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061399190611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a3691906156a0565b95945050505050565b5f808251602e14613a7557825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613ac457613a8c816001615c27565b613a97906008615a21565b61ffff16858281518110613aad57613aad615717565b016020015160f81c901b9190911790600101613a78565b5061ffff811615613aee5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613b4957613b05816003615c27565b613b10906008615a21565b63ffffffff1686613b228360026159ec565b81518110613b3257613b32615717565b016020015160f81c901b9190911790600101613af1565b5063ffffffff811615613b6f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bc457613b8681601f615c27565b613b91906008615a21565b87613b9d8360066159ec565b81518110613bad57613bad615717565b016020015160f81c901b9190911790600101613b72565b505f805b6008811015613c2357613bdc816007615c27565b613be7906008615a21565b6001600160401b031688613bfc8360266159ec565b81518110613c0c57613c0c615717565b016020015160f81c901b9190911790600101613bc8565b5090969095509350505050565b613c38615255565b5f8281525f805160206160858339815191526020526040808220815160e0810190925280545f8051602061602583398151915293929190829060ff166005811115613c8557613c85615496565b6005811115613c9657613c96615496565b8152602001600182018054613caa90615648565b80601f0160208091040260200160405190810160405280929190818152602001828054613cd690615648565b8015613d215780601f10613cf857610100808354040283529160200191613d21565b820191905f5260205f20905b815481529060010190602001808311613d0457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d8f57613d8f615496565b14613dc2575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615680565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e0657613e06615496565b021790555060208201516001820190613e1f908261591d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ebd858261374b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506148cd565b5f610cf3825f80516020615fe5833981519152546001600160a01b03169061492e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fda57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061602583398151915242613ff9606086016040870161545d565b6001600160401b031611158061403357506140176202a300426159ec565b614027606086016040870161545d565b6001600160401b031610155b1561406d57614048606085016040860161545d565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b61408261407d6060860186615d10565b614a87565b61409261407d6080860186615d10565b60306140a16020860186615c3a565b9050146140d3576140b56020850185615c3a565b6040516326475b2f60e11b81526104da925060040190815260200190565b6140dd8480615c3a565b90505f0361410a576140ef8480615c3a565b604051633e08a12560e11b81526004016104da929190615d24565b5f600882016141198680615c3a565b604051614127929190615b1b565b90815260200160405180910390205414614160576141458480615c3a565b60405163a41f772f60e01b81526004016104da929190615d24565b61416a835f614635565b6040805160e08101909152815481525f908190614276906020810161418f8980615c3a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141d7908a018a615c3a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161422060608a0160408b0161545d565b6001600160401b0316815260200161423b60608a018a615d10565b61424490615d52565b815260200161425660808a018a615d10565b61425f90615d52565b8152602001876001600160401b0316815250614bf0565b5f82815260068601602052604090209193509150614294828261591d565b5081600884016142a48880615c3a565b6040516142b2929190615b1b565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142ee90859060040161568e565b6020604051808303815f875af115801561430a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061432e91906156a0565b6040805160e08101909152909150806001815260200161434e8980615c3a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143dd576143dd615496565b0217905550602082015160018201906143f6908261591d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144948880615c3a565b6040516144a2929190615b1b565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144e0919061545d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661455757604051631afcd79f60e31b815260040160405180910390fd5b565b61456161450e565b61456a81614ddd565b614572614df6565b610dc26060820135608083013561458f60c0850160a0860161545d565b61459f60e0860160c08701615e19565b6145b0610100870160e08801615e32565b6101008701356145c861014089016101208a016156b7565b614e06565b6145d561450e565b5f80516020615fe58339815191526001600160a01b03821661461557604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f805160206160258339815191525f6001600160401b038084169085161115614669576146628385615b2a565b9050614676565b6146738484615b2a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146d85750600184015481516146d4916001600160401b0316906159ec565b8210155b156146fe576001600160401b03831660608201528181526040810151602082015261471d565b82816060018181516147109190615a71565b6001600160401b03169052505b606081015161472d906064615ce5565b602082015160018601546001600160401b0392909216916147589190600160401b900460ff16615a21565b101561478857606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516147a391906159ec565b9052506040810180516001600160401b03871691906147c3908390615c27565b905250600184015460408201516064916147e891600160401b90910460ff1690615a21565b101561480f578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160858339815191526020526040812060020180545f8051602061602583398151915291906008906148a290600160401b90046001600160401b0316615e52565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6148e16001600160a01b03841683614fc2565b905080515f141580156149055750808060200190518101906149039190615e6d565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614974573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061499891906156a0565b90506149af6001600160a01b038516333086614fcf565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156149f3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1791906156a0565b9050818111614a7d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b613a368282615c27565b614a946020820182615390565b63ffffffff16158015614ab45750614aaf60208201826156d2565b151590505b15614afb57614ac66020820182615390565b614ad360208301836156d2565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614b0860208201826156d2565b9050614b176020830183615390565b63ffffffff161115614b3057614ac66020820182615390565b60015b614b4060208301836156d2565b90508110156113cb57614b5660208301836156d2565b614b61600184615c27565b818110614b7057614b70615717565b9050602002016020810190614b8591906156b7565b6001600160a01b0316614b9b60208401846156d2565b83818110614bab57614bab615717565b9050602002016020810190614bc091906156b7565b6001600160a01b03161015614be857604051630dbc8d5f60e31b815260040160405180910390fd5b600101614b33565b5f6060826040015151603014614c195760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614c5a988a986001989297929690959094909390929101615e88565b60405160208183030381529060405290505f5b84608001516020015151811015614ccc57818560800151602001518281518110614c9957614c99615717565b6020026020010151604051602001614cb2929190615f42565b60408051601f198184030181529190529150600101614c6d565b5060a0840151805160209182015151604051614cec938593929101615f78565b60405160208183030381529060405290505f5b8460a001516020015151811015614d5e57818560a00151602001518281518110614d2b57614d2b615717565b6020026020010151604051602001614d44929190615f42565b60408051601f198184030181529190529150600101614cff565b5060c0840151604051614d75918391602001615fb3565b6040516020818303038152906040529050600281604051614d9691906158c8565b602060405180830381855afa158015614db1573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dd491906156a0565b94909350915050565b614de561450e565b614ded615008565b610dc281615010565b614dfe61450e565b6145576150f8565b614e0e61450e565b5f8051602061600583398151915261ffff85161580614e32575061271061ffff8616115b15614e5657604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614e7a5760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614e8d5750600a60ff8516115b15614eb05760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614f17576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614f375760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611ef283835f615100565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613f41565b61455761450e565b61501861450e565b80355f80516020616025833981519152908155601461503d6060840160408501615e32565b60ff16118061505c57506150576060830160408401615e32565b60ff16155b15615090576150716060830160408401615e32565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b6150a06060830160408401615e32565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556150d1604083016020840161545d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c7461450e565b6060814710156151255760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b0316848660405161514091906158c8565b5f6040518083038185875af1925050503d805f811461517a576040519150601f19603f3d011682016040523d82523d5f602084013e61517f565b606091505b509150915061518f868383615199565b9695505050505050565b6060826151ae576151a9826151f5565b611ef2565b81511580156151c557506001600160a01b0384163b155b156151ee57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611ef2565b8051156152055780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461522a90615648565b5f825580601f10615239575050565b601f0160209004905f5260205f2090810190610dc29190615292565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156152a6575f8155600101615293565b5090565b8015158114610dc2575f80fd5b803563ffffffff811681146152ca575f80fd5b919050565b5f805f606084860312156152e1575f80fd5b8335925060208401356152f3816152aa565b9150615301604085016152b7565b90509250925092565b5f6020828403121561531a575f80fd5b5035919050565b5f8060408385031215615332575f80fd5b82356001600160401b03811115615347575f80fd5b830160808186031215615358575f80fd5b9150615366602084016152b7565b90509250929050565b5f8060408385031215615380575f80fd5b82359150615366602084016152b7565b5f602082840312156153a0575f80fd5b611ef2826152b7565b803561ffff811681146152ca575f80fd5b80356001600160401b03811681146152ca575f80fd5b5f805f80608085870312156153e3575f80fd5b84356001600160401b038111156153f8575f80fd5b850160a08188031215615409575f80fd5b9350615417602086016153a9565b9250615425604086016153ba565b9396929550929360600135925050565b5f8060408385031215615446575f80fd5b61544f836152b7565b946020939093013593505050565b5f6020828403121561546d575f80fd5b611ef2826153ba565b5f8060408385031215615487575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106154ba576154ba615496565b9052565b5f5b838110156154d85781810151838201526020016154c0565b50505f910152565b5f81518084526154f78160208601602086016154be565b601f01601f19169290920160200192915050565b6020815261551d6020820183516154aa565b5f602083015160e060408401526155386101008401826154e0565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f808284036101608112156155b2575f80fd5b610140808212156155c1575f80fd5b84935083013590506155d28161558b565b809150509250929050565b5f80602083850312156155ee575f80fd5b82356001600160401b0380821115615604575f80fd5b818501915085601f830112615617575f80fd5b813581811115615625575f80fd5b866020828501011115615636575f80fd5b60209290920196919550909350505050565b600181811c9082168061565c57607f821691505b60208210810361567a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf382846154aa565b602081525f611ef260208301846154e0565b5f602082840312156156b0575f80fd5b5051919050565b5f602082840312156156c7575f80fd5b8135611ef28161558b565b5f808335601e198436030181126156e7575f80fd5b8301803591506001600160401b03821115615700575f80fd5b6020019150600581901b360382131561389b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261573f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561577f5761577f615749565b60405290565b604080519081016001600160401b038111828210171561577f5761577f615749565b604051601f8201601f191681016001600160401b03811182821017156157cf576157cf615749565b604052919050565b5f6001600160401b038211156157ef576157ef615749565b50601f01601f191660200190565b5f82601f83011261580c575f80fd5b813561581f61581a826157d7565b6157a7565b818152846020838601011115615833575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561585f575f80fd5b61586761575d565b82356001600160401b038082111561587d575f80fd5b615889368387016157fd565b8352602085013591508082111561589e575f80fd5b506158ab368286016157fd565b6020830152506158bd604084016153ba565b604082015292915050565b5f825161573f8184602087016154be565b601f8211156104e357805f5260205f20601f840160051c810160208510156158fe5750805b601f840160051c820191505b81811015611766575f815560010161590a565b81516001600160401b0381111561593657615936615749565b61594a816159448454615648565b846158d9565b602080601f83116001811461597d575f84156159665750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b828110156159ab5788860151825594840194600190910190840161598c565b50858210156159c857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf36159d8565b5f63ffffffff808316818103615a1757615a176159d8565b6001019392505050565b8082028115828204841417610cf357610cf36159d8565b5f82615a5257634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a6b57615a6b615496565b91905290565b6001600160401b03818116838216019080821115612057576120576159d8565b5f60208083525f8454615aa381615648565b806020870152604060018084165f8114615ac45760018114615ae057615b0d565b60ff19851660408a0152604084151560051b8a01019550615b0d565b895f5260205f205f5b85811015615b045781548b8201860152908301908801615ae9565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115612057576120576159d8565b80516152ca816152aa565b5f8060408385031215615b66575f80fd5b82516001600160401b0380821115615b7c575f80fd5b9084019060608287031215615b8f575f80fd5b615b9761575d565b82518152602080840151615baa8161558b565b82820152604084015183811115615bbf575f80fd5b80850194505087601f850112615bd3575f80fd5b83519250615be361581a846157d7565b8381528882858701011115615bf6575f80fd5b615c05848383018488016154be565b80604084015250819550615c1a818801615b4a565b9450505050509250929050565b81810381811115610cf357610cf36159d8565b5f808335601e19843603018112615c4f575f80fd5b8301803591506001600160401b03821115615c68575f80fd5b60200191503681900382131561389b575f80fd5b5f8851615c8d818460208d016154be565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615d0857615d086159d8565b505092915050565b5f8235603e1983360301811261573f575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d62575f80fd5b615d6a615785565b615d73836152b7565b81526020808401356001600160401b0380821115615d8f575f80fd5b9085019036601f830112615da1575f80fd5b813581811115615db357615db3615749565b8060051b9150615dc48483016157a7565b8181529183018401918481019036841115615ddd575f80fd5b938501935b83851015615e075784359250615df78361558b565b8282529385019390850190615de2565b94860194909452509295945050505050565b5f60208284031215615e29575f80fd5b611ef2826153a9565b5f60208284031215615e42575f80fd5b813560ff81168114611ef2575f80fd5b5f6001600160401b03808316818103615a1757615a176159d8565b5f60208284031215615e7d575f80fd5b8151611ef2816152aa565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615ece81602a850160208b016154be565b865190830190615ee581602a840160208b016154be565b60c087901b6001600160c01b031916602a9290910191820152615f17603282018660e01b6001600160e01b0319169052565b615f30603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f538184602088016154be565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f898184602089016154be565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615fc48184602088016154be565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 131a01b91..d6fa194a5 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615e4a380380615e4a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615cfd8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614fb4565b610615565b005b348015610221575f80fd5b50610214610230366004614fef565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614fb4565b610858565b34801561028a575f80fd5b50610214610299366004615006565b610863565b3480156102a9575f80fd5b506102146102b8366004615054565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614fef565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614fb4565b610e5b565b348015610378575f80fd5b50610214610387366004615075565b610e66565b348015610397575f80fd5b506102146103a636600461508e565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee3660046150cc565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614fef565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614fb4565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614fef565b611208565b348015610490575f80fd5b5061021461049f36600461508e565b6112d3565b3480156104af575f80fd5b506102146104be366004615075565b6114ab565b6103f36104d13660046150f6565b611634565b3480156104e1575f80fd5b506103f35f80516020615c5183398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614fef565b611668565b34801561053a575f80fd5b506103f35f80516020615c7183398151915281565b34801561055a575f80fd5b50610214610569366004614fef565b611851565b348015610579575f80fd5b5061021461058836600461514a565b61198e565b6103f361059b366004614fef565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614fef565b611a9c565b60405161025791906151d6565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f3610610366004615256565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615cd18339815191526020526040808220815160e0810190925280545f80516020615c7183398151915293929190829060ff16600581111561069757610697615161565b60058111156106a8576106a8615161565b81526020016001820180546106bc906152c1565b80601f01602080910402602001604051908101604052809291908181526020018280546106e8906152c1565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e615161565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f97565b6040518263ffffffff1660e01b81526004016108129190615301565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615313565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615c718339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615313565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b30610956606085016040860161533e565b6001600160a01b03161461099957610974606084016040850161533e565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a76060850185615359565b905090505f805b828163ffffffff161015610c8f575f6109ca6060880188615359565b8363ffffffff168181106109e0576109e061539e565b90506020028101906109f291906153b2565b6109fb906154d6565b80516040519192505f916008880191610a139161554f565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c9190600401615301565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c9161554f565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615313565b90508086600801835f0151604051610ae2919061554f565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b64615161565b021790555060208201516001820190610b7d90826155a4565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c22911685615673565b8251604051919550610c339161554f565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c8890615686565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836156a8565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fe6565b604001516120fc565b90505f610cf787612289565b90505f600282604051610d0a919061554f565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615313565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612463565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd7615161565b14610df7578060405163170cc93360e21b815260040161063c91906152f3565b610852838361249e565b5f805f80516020615c5183398151915260030154610e1f90846156bf565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612718565b610e6e612904565b5f80516020615c518339815191525f80610e878461293b565b91509150610e9482612463565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece615161565b03610ef3575f83815260088501602052604081208054919055610ef18282612c79565b505b610f0981610f048460400151611192565b612cd7565b505050505b610f2460015f80516020615cb183398151915255565b50565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff166003811115610f7457610f74615161565b6003811115610f8557610f85615161565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b905060018351600381111561101257611012615161565b14611033578251604051633b0d540d60e21b815261063c91906004016156de565b60048151600581111561104857611048615161565b0361105e5761105685612cfd565b505050505050565b5f8061107561106c89611fe6565b60400151612ee4565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b0384166156a8565b5f6111d382611a9c565b6080015192915050565b6111e8838383612718565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615c518339815191525f61122083611a9c565b519050600481600581111561123757611237615161565b14611257578060405163170cc93360e21b815260040161063c91906152f3565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c79565b6112db612904565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff16600381111561132857611328615161565b600381111561133957611339615161565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b2615161565b146113d3578051604051633b0d540d60e21b815261063c91906004016156de565b60046113e28260400151611a9c565b5160058111156113f4576113f4615161565b14611486575f61140385611fe6565b90505f806114148360400151612ee4565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612cfd565b50506114a760015f80516020615cb183398151915255565b5050565b5f80516020615c718339815191525f806114d06114c785611fe6565b6040015161313a565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f82815260068401602052604090208054611510906152c1565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a615161565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b5f82815260068401602052604081206115a591614f08565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d612904565b611649848484346132f6565b905061166160015f80516020615cb183398151915255565b9392505050565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff1660038111156116b5576116b5615161565b60038111156116c6576116c6615161565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f615161565b14158015611760575060038151600381111561175d5761175d615161565b14155b15611781578051604051633b0d540d60e21b815261063c91906004016156de565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151611f97565b6040518263ffffffff1660e01b815260040161180a9190615301565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615313565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615c718339815191529190611898906152c1565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e2615161565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e91906004016156f8565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615313565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f836134c4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a74612904565b611a7f8233346134d5565b9050611a9760015f80516020615cb183398151915255565b919050565b611aa4614f3f565b5f8281525f80516020615cd1833981519152602052604090819020815160e0810190925280545f80516020615c71833981519152929190829060ff166005811115611af157611af1615161565b6005811115611b0257611b02615161565b8152602001600182018054611b16906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b42906152c1565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615c71833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e9086908690615782565b90815260200160405180910390205491505092915050565b5f8381525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c518339815191529284929091829060ff166003811115611c9457611c94615161565b6003811115611ca557611ca5615161565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d32615161565b14611d53578251604051633b0d540d60e21b815261063c91906004016156de565b60208301516001600160a01b03163314611def575f8281526005850160205260409020546001600160a01b03163314611d8c5733611278565b5f82815260058501602052604090205460a0820151611dbb91600160b01b90046001600160401b031690615791565b6001600160401b0316421015611def5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0457611e04615161565b03611f325760028401546080840151611e26916001600160401b031690615791565b6001600160401b0316421015611e5a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e6c57611e6a828761249e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ea5918491611ea091906157b1565b6137aa565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee684613901565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611f4757611f47615161565b03611f7b57611f5583613901565b5f898152600786016020526040902055611f6e88612cfd565b6001945050505050611661565b805160405163170cc93360e21b815261063c91906004016152f3565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561204a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261207191908101906157dc565b915091508061209357604051636b2f19e960e01b815260040160405180910390fd5b8151156120b9578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120f5576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213157815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b6002811015612180576121488160016158ae565b6121539060086156a8565b61ffff168482815181106121695761216961539e565b016020015160f81c901b9190911790600101612134565b5061ffff8116156121aa5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612205576121c18160036158ae565b6121cc9060086156a8565b63ffffffff16856121de836002615673565b815181106121ee576121ee61539e565b016020015160f81c901b91909117906001016121ad565b5063ffffffff81161561222b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122805761224281601f6158ae565b61224d9060086156a8565b86612259836006615673565b815181106122695761226961539e565b016020015160f81c901b919091179060010161222e565b50949350505050565b60605f808335602085013560146122a58787016040890161533e565b6122b26060890189615359565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123386060850185615359565b90508110156120f5578161234f6060860186615359565b8381811061235f5761235f61539e565b905060200281019061237191906153b2565b61237b90806158c1565b905061238a6060870187615359565b8481811061239a5761239a61539e565b90506020028101906123ac91906153b2565b6123b690806158c1565b6123c36060890189615359565b868181106123d3576123d361539e565b90506020028101906123e591906153b2565b6123f39060208101906158c1565b61240060608b018b615359565b888181106124105761241061539e565b905060200281019061242291906153b2565b6124339060608101906040016150cc565b6040516020016124499796959493929190615903565b60408051601f19818403018152919052915060010161232b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261251091908101906157dc565b915091508061253257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612575573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125999190615313565b8251146125bf578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125fb576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f8061260a8460400151613a9e565b915091508187146126315760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615c51833981519152906001600160401b0390811690831611156126ee575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261270d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615c518339815191528161273186613c8f565b905061273c86612463565b61274b57600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127705733611278565b5f86815260058301602052604090205460a082015161279f91600160b01b90046001600160401b031690615791565b6001600160401b03168160c001516001600160401b031610156127e65760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127fe576127f7878661249e565b905061281c565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061284190611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156128aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ce9190615313565b905080846008015f8a81526020019081526020015f205f8282546128f29190615673565b90915550501515979650505050505050565b5f80516020615cb183398151915280546001190161293557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612944614f3f565b5f80516020615c718339815191525f806129606114c787611fe6565b91509150801561298757604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156129b8576129b8615161565b60058111156129c9576129c9615161565b81526020016001820180546129dd906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054612a09906152c1565b8015612a545780601f10612a2b57610100808354040283529160200191612a54565b820191905f5260205f20905b815481529060010190602001808311612a3757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612abf57612abf615161565b14158015612ae05750600181516005811115612add57612add615161565b14155b15612b0157805160405163170cc93360e21b815261063c91906004016152f3565b600381516005811115612b1657612b16615161565b03612b245760048152612b29565b600581525b836008018160200151604051612b3f919061554f565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b8357612b83615161565b021790555060208201516001820190612b9c90826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612c4257612c42615161565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612cc5575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613f73565b60015f80516020615cb183398151915255565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff166003811115612d4a57612d4a615161565b6003811115612d5b57612d5b615161565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e89575f84815260058701602052604090205461271090612e3b90600160a01b900461ffff16856156a8565b612e4591906156bf565b915081866008015f8681526020019081526020015f205f828254612e699190615673565b90915550612e79905082846158ae565b9050612e89856020015182612c79565b612e9e8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f1b57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612f6a57612f328160016158ae565b612f3d9060086156a8565b61ffff16868281518110612f5357612f5361539e565b016020015160f81c901b9190911790600101612f1e565b5061ffff811615612f945760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612fef57612fab8160036158ae565b612fb69060086156a8565b63ffffffff1687612fc8836002615673565b81518110612fd857612fd861539e565b016020015160f81c901b9190911790600101612f97565b5063ffffffff811660031461301757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561306c5761302e81601f6158ae565b6130399060086156a8565b88613045836006615673565b815181106130555761305561539e565b016020015160f81c901b919091179060010161301a565b505f805b60088110156130cb576130848160076158ae565b61308f9060086156a8565b6001600160401b0316896130a4836026615673565b815181106130b4576130b461539e565b016020015160f81c901b9190911790600101613070565b505f805b600881101561312a576130e38160076158ae565b6130ee9060086156a8565b6001600160401b03168a61310383602e615673565b815181106131135761311361539e565b016020015160f81c901b91909117906001016130cf565b5091989097509095509350505050565b5f80825160271461317057825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b60028110156131bf576131878160016158ae565b6131929060086156a8565b61ffff168582815181106131a8576131a861539e565b016020015160f81c901b9190911790600101613173565b5061ffff8116156131e95760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613244576132008160036158ae565b61320b9060086156a8565b63ffffffff168661321d836002615673565b8151811061322d5761322d61539e565b016020015160f81c901b91909117906001016131ec565b5063ffffffff811660021461326c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132c15761328381601f6158ae565b61328e9060086156a8565b8761329a836006615673565b815181106132aa576132aa61539e565b016020015160f81c901b919091179060010161326f565b505f866026815181106132d6576132d661539e565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615c5183398151915290600160401b900461ffff908116908616108061334a575061271061ffff8616115b1561336e57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b0390811690851610156133aa576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133bc5750806001015483115b156133dd5760405163222d164360e21b81526004810184905260240161063c565b825f6133e882610e01565b90505f6133f58983614006565b905060405180608001604052806134093390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6134cc61457e565b610f24816145c9565b5f5f80516020615c51833981519152816134ee84610e01565b90505f6134fa87611a9c565b905061350587612463565b613525576040516330efa98b60e01b81526004810188905260240161063c565b60028151600581111561353a5761353a615161565b1461355b57805160405163170cc93360e21b815261063c91906004016152f3565b5f82826080015161356c9190615791565b905083600201600a9054906101000a90046001600160401b03168260400151613595919061596c565b6001600160401b0316816001600160401b031611156135d257604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135de8a846137aa565b915091505f8a8360405160200161360c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561369f5761369f615161565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615cd1833981519152602052604081206002015481905f80516020615c7183398151915290600160801b90046001600160401b03166137f2858261463d565b5f6137fc87614860565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61384c8a858b611f97565b6040518263ffffffff1660e01b81526004016138689190615301565b6020604051808303815f875af1158015613884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138a89190615313565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615c5183398151915290505f6139218460400151611a9c565b90505f60038251600581111561393957613939615161565b1480613957575060048251600581111561395557613955615161565b145b15613967575060c08101516139a4565b60028251600581111561397c5761397c615161565b036139885750426139a4565b815160405163170cc93360e21b815261063c91906004016152f3565b84608001516001600160401b0316816001600160401b0316116139cb57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139f090611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a959190615313565b95945050505050565b5f808251602e14613ad457825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b2357613aeb8160016158ae565b613af69060086156a8565b61ffff16858281518110613b0c57613b0c61539e565b016020015160f81c901b9190911790600101613ad7565b5061ffff811615613b4d5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613ba857613b648160036158ae565b613b6f9060086156a8565b63ffffffff1686613b81836002615673565b81518110613b9157613b9161539e565b016020015160f81c901b9190911790600101613b50565b5063ffffffff811615613bce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c2357613be581601f6158ae565b613bf09060086156a8565b87613bfc836006615673565b81518110613c0c57613c0c61539e565b016020015160f81c901b9190911790600101613bd1565b505f805b6008811015613c8257613c3b8160076158ae565b613c469060086156a8565b6001600160401b031688613c5b836026615673565b81518110613c6b57613c6b61539e565b016020015160f81c901b9190911790600101613c27565b5090969095509350505050565b613c97614f3f565b5f8281525f80516020615cd18339815191526020526040808220815160e0810190925280545f80516020615c7183398151915293929190829060ff166005811115613ce457613ce4615161565b6005811115613cf557613cf5615161565b8152602001600182018054613d09906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054613d35906152c1565b8015613d805780601f10613d5757610100808354040283529160200191613d80565b820191905f5260205f20905b815481529060010190602001808311613d6357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dee57613dee615161565b14613e21575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e6557613e65615161565b021790555060208201516001820190613e7e90826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f1c85826137aa565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f965760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fdf576040519150601f19603f3d011682016040523d82523d5f602084013e613fe4565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661404a57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615c718339815191524261406960608601604087016150cc565b6001600160401b03161115806140a357506140876202a30042615673565b61409760608601604087016150cc565b6001600160401b031610155b156140dd576140b860608501604086016150cc565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6140f26140ed6060860186615997565b6148d5565b6141026140ed6080860186615997565b603061411160208601866158c1565b9050146141435761412560208501856158c1565b6040516326475b2f60e11b815261063c925060040190815260200190565b61414d84806158c1565b90505f0361417a5761415f84806158c1565b604051633e08a12560e11b815260040161063c9291906159ab565b5f6008820161418986806158c1565b604051614197929190615782565b908152602001604051809103902054146141d0576141b584806158c1565b60405163a41f772f60e01b815260040161063c9291906159ab565b6141da835f61463d565b6040805160e08101909152815481525f9081906142e690602081016141ff89806158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614247908a018a6158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161429060608a0160408b016150cc565b6001600160401b031681526020016142ab60608a018a615997565b6142b4906159d9565b81526020016142c660808a018a615997565b6142cf906159d9565b8152602001876001600160401b0316815250614a3e565b5f8281526006860160205260409020919350915061430482826155a4565b50816008840161431488806158c1565b604051614322929190615782565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061435e908590600401615301565b6020604051808303815f875af115801561437a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061439e9190615313565b6040805160e0810190915290915080600181526020016143be89806158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561444d5761444d615161565b02179055506020820151600182019061446690826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061450488806158c1565b604051614512929190615782565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061455091906150cc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166145c757604051631afcd79f60e31b815260040160405180910390fd5b565b6145d161457e565b6145da81614c2b565b6145e2614c44565b610f24606082013560808301356145ff60c0850160a086016150cc565b61460f60e0860160c08701615aa0565b614620610100870160e08801615ab9565b61010087013561463861014089016101208a0161533e565b614c54565b5f80516020615c718339815191525f6001600160401b0380841690851611156146715761466a83856157b1565b905061467e565b61467b84846157b1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146e05750600184015481516146dc916001600160401b031690615673565b8210155b15614706576001600160401b038316606082015281815260408101516020820152614725565b82816060018181516147189190615791565b6001600160401b03169052505b606081015161473590606461596c565b602082015160018601546001600160401b0392909216916147609190600160401b900460ff166156a8565b101561479057606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b0316816040018181516147ab9190615673565b9052506040810180516001600160401b03871691906147cb9083906158ae565b905250600184015460408201516064916147f091600160401b90910460ff16906156a8565b1015614817578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615cd18339815191526020526040812060020180545f80516020615c7183398151915291906008906148aa90600160401b90046001600160401b0316615ad9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148e26020820182615075565b63ffffffff1615801561490257506148fd6020820182615359565b151590505b15614949576149146020820182615075565b6149216020830183615359565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149566020820182615359565b90506149656020830183615075565b63ffffffff16111561497e576149146020820182615075565b60015b61498e6020830183615359565b90508110156114a7576149a46020830183615359565b6149af6001846158ae565b8181106149be576149be61539e565b90506020020160208101906149d3919061533e565b6001600160a01b03166149e96020840184615359565b838181106149f9576149f961539e565b9050602002016020810190614a0e919061533e565b6001600160a01b03161015614a3657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614981565b5f6060826040015151603014614a675760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614aa8988a986001989297929690959094909390929101615af4565b60405160208183030381529060405290505f5b84608001516020015151811015614b1a57818560800151602001518281518110614ae757614ae761539e565b6020026020010151604051602001614b00929190615bae565b60408051601f198184030181529190529150600101614abb565b5060a0840151805160209182015151604051614b3a938593929101615be4565b60405160208183030381529060405290505f5b8460a001516020015151811015614bac57818560a00151602001518281518110614b7957614b7961539e565b6020026020010151604051602001614b92929190615bae565b60408051601f198184030181529190529150600101614b4d565b5060c0840151604051614bc3918391602001615c1f565b6040516020818303038152906040529050600281604051614be4919061554f565b602060405180830381855afa158015614bff573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c229190615313565b94909350915050565b614c3361457e565b614c3b614e10565b610f2481614e18565b614c4c61457e565b6145c7614f00565b614c5c61457e565b5f80516020615c5183398151915261ffff85161580614c80575061271061ffff8616115b15614ca457604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614cc85760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614cdb5750600a60ff8516115b15614cfe5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614d65576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614d855760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6145c761457e565b614e2061457e565b80355f80516020615c718339815191529081556014614e456060840160408501615ab9565b60ff161180614e645750614e5f6060830160408401615ab9565b60ff16155b15614e9857614e796060830160408401615ab9565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614ea86060830160408401615ab9565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614ed960408301602084016150cc565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612cea61457e565b508054614f14906152c1565b5f825580601f10614f23575050565b601f0160209004905f5260205f2090810190610f249190614f7c565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614f90575f8155600101614f7d565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215614fc6575f80fd5b833592506020840135614fd881614f94565b9150614fe660408501614fa1565b90509250925092565b5f60208284031215614fff575f80fd5b5035919050565b5f8060408385031215615017575f80fd5b82356001600160401b0381111561502c575f80fd5b83016080818603121561503d575f80fd5b915061504b60208401614fa1565b90509250929050565b5f8060408385031215615065575f80fd5b8235915061504b60208401614fa1565b5f60208284031215615085575f80fd5b61166182614fa1565b5f806040838503121561509f575f80fd5b6150a883614fa1565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f602082840312156150dc575f80fd5b611661826150b6565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615108575f80fd5b83356001600160401b0381111561511d575f80fd5b840160a0818703121561512e575f80fd5b925061513c602085016150e5565b9150614fe6604085016150b6565b5f610140828403121561515b575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061518557615185615161565b9052565b5f5b838110156151a357818101518382015260200161518b565b50505f910152565b5f81518084526151c2816020860160208601615189565b601f01601f19169290920160200192915050565b602081526151e8602082018351615175565b5f602083015160e060408401526152036101008401826151ab565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615267575f80fd5b82356001600160401b038082111561527d575f80fd5b818501915085601f830112615290575f80fd5b81358181111561529e575f80fd5b8660208285010111156152af575f80fd5b60209290920196919550909350505050565b600181811c908216806152d557607f821691505b60208210810361515b57634e487b7160e01b5f52602260045260245ffd5b60208101610e558284615175565b602081525f61166160208301846151ab565b5f60208284031215615323575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f6020828403121561534e575f80fd5b81356116618161532a565b5f808335601e1984360301811261536e575f80fd5b8301803591506001600160401b03821115615387575f80fd5b6020019150600581901b36038213156138fa575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153c6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615406576154066153d0565b60405290565b604080519081016001600160401b0381118282101715615406576154066153d0565b604051601f8201601f191681016001600160401b0381118282101715615456576154566153d0565b604052919050565b5f6001600160401b03821115615476576154766153d0565b50601f01601f191660200190565b5f82601f830112615493575f80fd5b81356154a66154a18261545e565b61542e565b8181528460208386010111156154ba575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156154e6575f80fd5b6154ee6153e4565b82356001600160401b0380821115615504575f80fd5b61551036838701615484565b83526020850135915080821115615525575f80fd5b5061553236828601615484565b602083015250615544604084016150b6565b604082015292915050565b5f82516153c6818460208701615189565b601f82111561064557805f5260205f20601f840160051c810160208510156155855750805b601f840160051c820191505b8181101561184a575f8155600101615591565b81516001600160401b038111156155bd576155bd6153d0565b6155d1816155cb84546152c1565b84615560565b602080601f831160018114615604575f84156155ed5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b8281101561563257888601518255948401946001909101908401615613565b508582101561564f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e5561565f565b5f63ffffffff80831681810361569e5761569e61565f565b6001019392505050565b8082028115828204841417610e5557610e5561565f565b5f826156d957634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106156f2576156f2615161565b91905290565b5f60208083525f845461570a816152c1565b806020870152604060018084165f811461572b576001811461574757615774565b60ff19851660408a0152604084151560051b8a01019550615774565b895f5260205f205f5b8581101561576b5781548b8201860152908301908801615750565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120f5576120f561565f565b6001600160401b038281168282160390808211156120f5576120f561565f565b8051611a9781614f94565b5f80604083850312156157ed575f80fd5b82516001600160401b0380821115615803575f80fd5b9084019060608287031215615816575f80fd5b61581e6153e4565b825181526020808401516158318161532a565b82820152604084015183811115615846575f80fd5b80850194505087601f85011261585a575f80fd5b8351925061586a6154a18461545e565b838152888285870101111561587d575f80fd5b61588c84838301848801615189565b806040840152508195506158a18188016157d1565b9450505050509250929050565b81810381811115610e5557610e5561565f565b5f808335601e198436030181126158d6575f80fd5b8301803591506001600160401b038211156158ef575f80fd5b6020019150368190038213156138fa575f80fd5b5f8851615914818460208d01615189565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461598f5761598f61565f565b505092915050565b5f8235603e198336030181126153c6575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156159e9575f80fd5b6159f161540c565b6159fa83614fa1565b81526020808401356001600160401b0380821115615a16575f80fd5b9085019036601f830112615a28575f80fd5b813581811115615a3a57615a3a6153d0565b8060051b9150615a4b84830161542e565b8181529183018401918481019036841115615a64575f80fd5b938501935b83851015615a8e5784359250615a7e8361532a565b8282529385019390850190615a69565b94860194909452509295945050505050565b5f60208284031215615ab0575f80fd5b611661826150e5565b5f60208284031215615ac9575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b0380831681810361569e5761569e61565f565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615b3a81602a850160208b01615189565b865190830190615b5181602a840160208b01615189565b60c087901b6001600160c01b031916602a9290910191820152615b83603282018660e01b6001600160e01b0319169052565b615b9c603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615bbf818460208801615189565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615bf5818460208901615189565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615c30818460208801615189565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615f09380380615f0983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615dbc8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004615073565b610615565b005b348015610221575f80fd5b506102146102303660046150ae565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004615073565b610858565b34801561028a575f80fd5b506102146102993660046150c5565b610863565b3480156102a9575f80fd5b506102146102b8366004615113565b610d8d565b3480156102c8575f80fd5b506102dc6102d73660046150ae565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004615073565b610e5b565b348015610378575f80fd5b50610214610387366004615134565b610e66565b348015610397575f80fd5b506102146103a636600461514d565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee36600461518b565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b3660046150ae565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004615073565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b506102146104803660046150ae565b611208565b348015610490575f80fd5b5061021461049f36600461514d565b6112d3565b3480156104af575f80fd5b506102146104be366004615134565b6114fc565b6103f36104d13660046151b5565b611685565b3480156104e1575f80fd5b506103f35f80516020615d1083398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a3660046150ae565b6116b9565b34801561053a575f80fd5b506103f35f80516020615d3083398151915281565b34801561055a575f80fd5b506102146105693660046150ae565b6118a2565b348015610579575f80fd5b50610214610588366004615209565b6119df565b6103f361059b3660046150ae565b611abc565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce3660046150ae565b611aed565b6040516102579190615295565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f3610610366004615315565b611c3c565b610620838383611c97565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d908339815191526020526040808220815160e0810190925280545f80516020615d3083398151915293929190829060ff16600581111561069757610697615220565b60058111156106a8576106a8615220565b81526020016001820180546106bc90615380565b80601f01602080910402602001604051908101604052809291908181526020018280546106e890615380565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e615220565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016153b2565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f612056565b6040518263ffffffff1660e01b815260040161081291906153c0565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906153d2565b50505050565b610852838383611c97565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615d308339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c91906153d2565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016153fd565b6001600160a01b0316146109995761097460608401604085016153fd565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a76060850185615418565b905090505f805b828163ffffffff161015610c8f575f6109ca6060880188615418565b8363ffffffff168181106109e0576109e061545d565b90506020028101906109f29190615471565b6109fb90615595565b80516040519192505f916008880191610a139161560e565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c91906004016153c0565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c9161560e565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca91906153d2565b90508086600801835f0151604051610ae2919061560e565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b64615220565b021790555060208201516001820190610b7d9082615663565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c22911685615732565b8251604051919550610c339161560e565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c8890615745565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615767565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce2866120a5565b604001516121bb565b90505f610cf787612348565b90505f600282604051610d0a919061560e565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d4891906153d2565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612522565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611aed565b5190506002816005811115610dd757610dd7615220565b14610df7578060405163170cc93360e21b815260040161063c91906153b2565b610852838361255d565b5f805f80516020615d1083398151915260030154610e1f908461577e565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b6108528383836127d7565b610e6e6129c3565b5f80516020615d108339815191525f80610e87846129fa565b91509150610e9482612522565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece615220565b03610ef3575f83815260088501602052604081208054919055610ef18282612d38565b505b610f0981610f048460400151611192565b612d96565b505050505b610f2460015f80516020615d7083398151915255565b50565b5f8181525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d1083398151915293929190829060ff166003811115610f7457610f74615220565b6003811115610f8557610f85615220565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611aed565b905060018351600381111561101257611012615220565b14611033578251604051633b0d540d60e21b815261063c919060040161579d565b60048151600581111561104857611048615220565b0361105e5761105685612dbc565b505050505050565b5f8061107561106c896120a5565b60400151612fa3565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b038416615767565b5f6111d382611aed565b6080015192915050565b6111e88383836127d7565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615d108339815191525f61122083611aed565b519050600481600581111561123757611237615220565b14611257578060405163170cc93360e21b815260040161063c91906153b2565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612d38565b6112db6129c3565b5f8181525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d1083398151915293929190829060ff16600381111561132857611328615220565b600381111561133957611339615220565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b2615220565b146113d3578051604051633b0d540d60e21b815261063c919060040161579d565b600282015460808201516113f0916001600160401b0316906157b7565b6001600160401b03164210156114245760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b60046114338260400151611aed565b51600581111561144557611445615220565b146114d7575f611454856120a5565b90505f806114658360400151612fa3565b5091509150818460400151146114915760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b031611156114d357604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b6114e083612dbc565b50506114f860015f80516020615d7083398151915255565b5050565b5f80516020615d308339815191525f80611521611518856120a5565b604001516131f9565b915091508061154757604051632d07135360e01b8152811515600482015260240161063c565b5f8281526006840160205260409020805461156190615380565b90505f036115855760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff1660058111156115ab576115ab615220565b146115de575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016153b2565b5f82815260068401602052604081206115f691614fc7565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61168e6129c3565b61169a848484346133b5565b90506116b260015f80516020615d7083398151915255565b9392505050565b5f8181525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d1083398151915293929190829060ff16600381111561170657611706615220565b600381111561171757611717615220565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561179057611790615220565b141580156117b157506003815160038111156117ae576117ae615220565b14155b156117d2578051604051633b0d540d60e21b815261063c919060040161579d565b5f6117e08260400151611aed565b905080606001516001600160401b03165f03611812576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb61183f846040015184606001518560800151612056565b6040518263ffffffff1660e01b815260040161185b91906153c0565b6020604051808303815f875af1158015611877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061189b91906153d2565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615d3083398151915291906118e990615380565b90505f0361190d5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff16600581111561193357611933615220565b14611966575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016153b2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161199f91906004016157d7565b6020604051808303815f875af11580156119bb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064591906153d2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a28575080546001600160401b03808416911610155b15611a465760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a7083613583565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611ac56129c3565b611ad0823334613594565b9050611ae860015f80516020615d7083398151915255565b919050565b611af5614ffe565b5f8281525f80516020615d90833981519152602052604090819020815160e0810190925280545f80516020615d30833981519152929190829060ff166005811115611b4257611b42615220565b6005811115611b5357611b53615220565b8152602001600182018054611b6790615380565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9390615380565b8015611bde5780601f10611bb557610100808354040283529160200191611bde565b820191905f5260205f20905b815481529060010190602001808311611bc157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615d30833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c7f9086908690615861565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d108339815191529284929091829060ff166003811115611ce557611ce5615220565b6003811115611cf657611cf6615220565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d6c82611aed565b9050600283516003811115611d8357611d83615220565b14611da4578251604051633b0d540d60e21b815261063c919060040161579d565b60208301516001600160a01b03163314611e40575f8281526005850160205260409020546001600160a01b03163314611ddd5733611278565b5f82815260058501602052604090205460a0820151611e0c91600160b01b90046001600160401b0316906157b7565b6001600160401b0316421015611e405760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e5557611e55615220565b03611f835760028401546080840151611e77916001600160401b0316906157b7565b6001600160401b0316421015611eab5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611ebd57611ebb828761255d565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ef6918491611ef19190615870565b613869565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611f37846139c0565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116b29350505050565b600481516005811115611f9857611f98615220565b0361203a577fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03168360800151611fd791906157b7565b6001600160401b031642101561200b5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b612014836139c0565b5f89815260078601602052604090205561202d88612dbc565b60019450505050506116b2565b805160405163170cc93360e21b815261063c91906004016153b2565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612109573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612130919081019061589b565b915091508061215257604051636b2f19e960e01b815260040160405180910390fd5b815115612178578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156121b4576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f81516026146121f057815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b600281101561223f5761220781600161596d565b612212906008615767565b61ffff168482815181106122285761222861545d565b016020015160f81c901b91909117906001016121f3565b5061ffff8116156122695760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156122c45761228081600361596d565b61228b906008615767565b63ffffffff168561229d836002615732565b815181106122ad576122ad61545d565b016020015160f81c901b919091179060010161226c565b5063ffffffff8116156122ea57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561233f5761230181601f61596d565b61230c906008615767565b86612318836006615732565b815181106123285761232861545d565b016020015160f81c901b91909117906001016122ed565b50949350505050565b60605f80833560208501356014612364878701604089016153fd565b6123716060890189615418565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123f76060850185615418565b90508110156121b4578161240e6060860186615418565b8381811061241e5761241e61545d565b90506020028101906124309190615471565b61243a9080615980565b90506124496060870187615418565b848181106124595761245961545d565b905060200281019061246b9190615471565b6124759080615980565b6124826060890189615418565b868181106124925761249261545d565b90506020028101906124a49190615471565b6124b2906020810190615980565b6124bf60608b018b615418565b888181106124cf576124cf61545d565b90506020028101906124e19190615471565b6124f290606081019060400161518b565b60405160200161250897969594939291906159c2565b60408051601f1981840301815291905291506001016123ea565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125a8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125cf919081019061589b565b91509150806125f157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061265891906153d2565b82511461267e578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156126ba576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806126c98460400151613b5d565b915091508187146126f05760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615d10833981519152906001600160401b0390811690831611156127ad575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26127cc565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615d10833981519152816127f086613d4e565b90506127fb86612522565b61280a576001925050506116b2565b5f8681526005830160205260409020546001600160a01b0316331461282f5733611278565b5f86815260058301602052604090205460a082015161285e91600160b01b90046001600160401b0316906157b7565b6001600160401b03168160c001516001600160401b031610156128a55760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156128bd576128b6878661255d565b90506128db565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061290090611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612969573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061298d91906153d2565b905080846008015f8a81526020019081526020015f205f8282546129b19190615732565b90915550501515979650505050505050565b5f80516020615d708339815191528054600119016129f457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612a03614ffe565b5f80516020615d308339815191525f80612a1f611518876120a5565b915091508015612a4657604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612a7757612a77615220565b6005811115612a8857612a88615220565b8152602001600182018054612a9c90615380565b80601f0160208091040260200160405190810160405280929190818152602001828054612ac890615380565b8015612b135780601f10612aea57610100808354040283529160200191612b13565b820191905f5260205f20905b815481529060010190602001808311612af657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612b7e57612b7e615220565b14158015612b9f5750600181516005811115612b9c57612b9c615220565b14155b15612bc057805160405163170cc93360e21b815261063c91906004016153b2565b600381516005811115612bd557612bd5615220565b03612be35760048152612be8565b600581525b836008018160200151604051612bfe919061560e565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612c4257612c42615220565b021790555060208201516001820190612c5b9082615663565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612d0157612d01615220565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612d84575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114f86001600160a01b03831682614032565b60015f80516020615d7083398151915255565b5f8181525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d1083398151915293929190829060ff166003811115612e0957612e09615220565b6003811115612e1a57612e1a615220565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612f48575f84815260058701602052604090205461271090612efa90600160a01b900461ffff1685615767565b612f04919061577e565b915081866008015f8681526020019081526020015f205f828254612f289190615732565b90915550612f389050828461596d565b9050612f48856020015182612d38565b612f5d8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612fda57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b600281101561302957612ff181600161596d565b612ffc906008615767565b61ffff168682815181106130125761301261545d565b016020015160f81c901b9190911790600101612fdd565b5061ffff8116156130535760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156130ae5761306a81600361596d565b613075906008615767565b63ffffffff1687613087836002615732565b815181106130975761309761545d565b016020015160f81c901b9190911790600101613056565b5063ffffffff81166003146130d657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561312b576130ed81601f61596d565b6130f8906008615767565b88613104836006615732565b815181106131145761311461545d565b016020015160f81c901b91909117906001016130d9565b505f805b600881101561318a5761314381600761596d565b61314e906008615767565b6001600160401b031689613163836026615732565b815181106131735761317361545d565b016020015160f81c901b919091179060010161312f565b505f805b60088110156131e9576131a281600761596d565b6131ad906008615767565b6001600160401b03168a6131c283602e615732565b815181106131d2576131d261545d565b016020015160f81c901b919091179060010161318e565b5091989097509095509350505050565b5f80825160271461322f57825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561327e5761324681600161596d565b613251906008615767565b61ffff168582815181106132675761326761545d565b016020015160f81c901b9190911790600101613232565b5061ffff8116156132a85760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613303576132bf81600361596d565b6132ca906008615767565b63ffffffff16866132dc836002615732565b815181106132ec576132ec61545d565b016020015160f81c901b91909117906001016132ab565b5063ffffffff811660021461332b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156133805761334281601f61596d565b61334d906008615767565b87613359836006615732565b815181106133695761336961545d565b016020015160f81c901b919091179060010161332e565b505f866026815181106133955761339561545d565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615d1083398151915290600160401b900461ffff9081169086161080613409575061271061ffff8616115b1561342d57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613469576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b805483108061347b5750806001015483115b1561349c5760405163222d164360e21b81526004810184905260240161063c565b825f6134a782610e01565b90505f6134b489836140c5565b905060405180608001604052806134c83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61358b61463d565b610f2481614688565b5f5f80516020615d10833981519152816135ad84610e01565b90505f6135b987611aed565b90506135c487612522565b6135e4576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156135f9576135f9615220565b1461361a57805160405163170cc93360e21b815261063c91906004016153b2565b5f82826080015161362b91906157b7565b905083600201600a9054906101000a90046001600160401b031682604001516136549190615a2b565b6001600160401b0316816001600160401b0316111561369157604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061369d8a84613869565b915091505f8a836040516020016136cb92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561375e5761375e615220565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d90833981519152602052604081206002015481905f80516020615d3083398151915290600160801b90046001600160401b03166138b185826146fc565b5f6138bb8761491f565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61390b8a858b612056565b6040518263ffffffff1660e01b815260040161392791906153c0565b6020604051808303815f875af1158015613943573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061396791906153d2565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615d1083398151915290505f6139e08460400151611aed565b90505f6003825160058111156139f8576139f8615220565b1480613a165750600482516005811115613a1457613a14615220565b145b15613a26575060c0810151613a63565b600282516005811115613a3b57613a3b615220565b03613a47575042613a63565b815160405163170cc93360e21b815261063c91906004016153b2565b84608001516001600160401b0316816001600160401b031611613a8a57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613aaf90611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613b30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b5491906153d2565b95945050505050565b5f808251602e14613b9357825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613be257613baa81600161596d565b613bb5906008615767565b61ffff16858281518110613bcb57613bcb61545d565b016020015160f81c901b9190911790600101613b96565b5061ffff811615613c0c5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613c6757613c2381600361596d565b613c2e906008615767565b63ffffffff1686613c40836002615732565b81518110613c5057613c5061545d565b016020015160f81c901b9190911790600101613c0f565b5063ffffffff811615613c8d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613ce257613ca481601f61596d565b613caf906008615767565b87613cbb836006615732565b81518110613ccb57613ccb61545d565b016020015160f81c901b9190911790600101613c90565b505f805b6008811015613d4157613cfa81600761596d565b613d05906008615767565b6001600160401b031688613d1a836026615732565b81518110613d2a57613d2a61545d565b016020015160f81c901b9190911790600101613ce6565b5090969095509350505050565b613d56614ffe565b5f8281525f80516020615d908339815191526020526040808220815160e0810190925280545f80516020615d3083398151915293929190829060ff166005811115613da357613da3615220565b6005811115613db457613db4615220565b8152602001600182018054613dc890615380565b80601f0160208091040260200160405190810160405280929190818152602001828054613df490615380565b8015613e3f5780601f10613e1657610100808354040283529160200191613e3f565b820191905f5260205f20905b815481529060010190602001808311613e2257829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613ead57613ead615220565b14613ee0575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016153b2565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613f2457613f24615220565b021790555060208201516001820190613f3d9082615663565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613fdb8582613869565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156140555760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461409e576040519150601f19603f3d011682016040523d82523d5f602084013e6140a3565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661410957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615d3083398151915242614128606086016040870161518b565b6001600160401b031611158061416257506141466202a30042615732565b614156606086016040870161518b565b6001600160401b031610155b1561419c57614177606085016040860161518b565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6141b16141ac6060860186615a56565b614994565b6141c16141ac6080860186615a56565b60306141d06020860186615980565b905014614202576141e46020850185615980565b6040516326475b2f60e11b815261063c925060040190815260200190565b61420c8480615980565b90505f036142395761421e8480615980565b604051633e08a12560e11b815260040161063c929190615a6a565b5f600882016142488680615980565b604051614256929190615861565b9081526020016040518091039020541461428f576142748480615980565b60405163a41f772f60e01b815260040161063c929190615a6a565b614299835f6146fc565b6040805160e08101909152815481525f9081906143a590602081016142be8980615980565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614306908a018a615980565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161434f60608a0160408b0161518b565b6001600160401b0316815260200161436a60608a018a615a56565b61437390615a98565b815260200161438560808a018a615a56565b61438e90615a98565b8152602001876001600160401b0316815250614afd565b5f828152600686016020526040902091935091506143c38282615663565b5081600884016143d38880615980565b6040516143e1929190615861565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061441d9085906004016153c0565b6020604051808303815f875af1158015614439573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061445d91906153d2565b6040805160e08101909152909150806001815260200161447d8980615980565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561450c5761450c615220565b0217905550602082015160018201906145259082615663565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806145c38880615980565b6040516145d1929190615861565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061460f919061518b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661468657604051631afcd79f60e31b815260040160405180910390fd5b565b61469061463d565b61469981614cea565b6146a1614d03565b610f24606082013560808301356146be60c0850160a0860161518b565b6146ce60e0860160c08701615b5f565b6146df610100870160e08801615b78565b6101008701356146f761014089016101208a016153fd565b614d13565b5f80516020615d308339815191525f6001600160401b038084169085161115614730576147298385615870565b905061473d565b61473a8484615870565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061479f57506001840154815161479b916001600160401b031690615732565b8210155b156147c5576001600160401b0383166060820152818152604081015160208201526147e4565b82816060018181516147d791906157b7565b6001600160401b03169052505b60608101516147f4906064615a2b565b602082015160018601546001600160401b03929092169161481f9190600160401b900460ff16615767565b101561484f57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161486a9190615732565b9052506040810180516001600160401b038716919061488a90839061596d565b905250600184015460408201516064916148af91600160401b90910460ff1690615767565b10156148d6578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d908339815191526020526040812060020180545f80516020615d30833981519152919060089061496990600160401b90046001600160401b0316615b98565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6149a16020820182615134565b63ffffffff161580156149c157506149bc6020820182615418565b151590505b15614a08576149d36020820182615134565b6149e06020830183615418565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b614a156020820182615418565b9050614a246020830183615134565b63ffffffff161115614a3d576149d36020820182615134565b60015b614a4d6020830183615418565b90508110156114f857614a636020830183615418565b614a6e60018461596d565b818110614a7d57614a7d61545d565b9050602002016020810190614a9291906153fd565b6001600160a01b0316614aa86020840184615418565b83818110614ab857614ab861545d565b9050602002016020810190614acd91906153fd565b6001600160a01b03161015614af557604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a40565b5f6060826040015151603014614b265760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b67988a986001989297929690959094909390929101615bb3565b60405160208183030381529060405290505f5b84608001516020015151811015614bd957818560800151602001518281518110614ba657614ba661545d565b6020026020010151604051602001614bbf929190615c6d565b60408051601f198184030181529190529150600101614b7a565b5060a0840151805160209182015151604051614bf9938593929101615ca3565b60405160208183030381529060405290505f5b8460a001516020015151811015614c6b57818560a00151602001518281518110614c3857614c3861545d565b6020026020010151604051602001614c51929190615c6d565b60408051601f198184030181529190529150600101614c0c565b5060c0840151604051614c82918391602001615cde565b6040516020818303038152906040529050600281604051614ca3919061560e565b602060405180830381855afa158015614cbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ce191906153d2565b94909350915050565b614cf261463d565b614cfa614ecf565b610f2481614ed7565b614d0b61463d565b614686614fbf565b614d1b61463d565b5f80516020615d1083398151915261ffff85161580614d3f575061271061ffff8616115b15614d6357604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614d875760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614d9a5750600a60ff8516115b15614dbd5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614e24576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614e445760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61468661463d565b614edf61463d565b80355f80516020615d308339815191529081556014614f046060840160408501615b78565b60ff161180614f235750614f1e6060830160408401615b78565b60ff16155b15614f5757614f386060830160408401615b78565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614f676060830160408401615b78565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f98604083016020840161518b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612da961463d565b508054614fd390615380565b5f825580601f10614fe2575050565b601f0160209004905f5260205f2090810190610f24919061503b565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b8082111561504f575f815560010161503c565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611ae8575f80fd5b5f805f60608486031215615085575f80fd5b83359250602084013561509781615053565b91506150a560408501615060565b90509250925092565b5f602082840312156150be575f80fd5b5035919050565b5f80604083850312156150d6575f80fd5b82356001600160401b038111156150eb575f80fd5b8301608081860312156150fc575f80fd5b915061510a60208401615060565b90509250929050565b5f8060408385031215615124575f80fd5b8235915061510a60208401615060565b5f60208284031215615144575f80fd5b6116b282615060565b5f806040838503121561515e575f80fd5b61516783615060565b946020939093013593505050565b80356001600160401b0381168114611ae8575f80fd5b5f6020828403121561519b575f80fd5b6116b282615175565b803561ffff81168114611ae8575f80fd5b5f805f606084860312156151c7575f80fd5b83356001600160401b038111156151dc575f80fd5b840160a081870312156151ed575f80fd5b92506151fb602085016151a4565b91506150a560408501615175565b5f610140828403121561521a575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061524457615244615220565b9052565b5f5b8381101561526257818101518382015260200161524a565b50505f910152565b5f8151808452615281816020860160208601615248565b601f01601f19169290920160200192915050565b602081526152a7602082018351615234565b5f602083015160e060408401526152c261010084018261526a565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615326575f80fd5b82356001600160401b038082111561533c575f80fd5b818501915085601f83011261534f575f80fd5b81358181111561535d575f80fd5b86602082850101111561536e575f80fd5b60209290920196919550909350505050565b600181811c9082168061539457607f821691505b60208210810361521a57634e487b7160e01b5f52602260045260245ffd5b60208101610e558284615234565b602081525f6116b2602083018461526a565b5f602082840312156153e2575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f6020828403121561540d575f80fd5b81356116b2816153e9565b5f808335601e1984360301811261542d575f80fd5b8301803591506001600160401b03821115615446575f80fd5b6020019150600581901b36038213156139b9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615485575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154c5576154c561548f565b60405290565b604080519081016001600160401b03811182821017156154c5576154c561548f565b604051601f8201601f191681016001600160401b03811182821017156155155761551561548f565b604052919050565b5f6001600160401b038211156155355761553561548f565b50601f01601f191660200190565b5f82601f830112615552575f80fd5b81356155656155608261551d565b6154ed565b818152846020838601011115615579575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155a5575f80fd5b6155ad6154a3565b82356001600160401b03808211156155c3575f80fd5b6155cf36838701615543565b835260208501359150808211156155e4575f80fd5b506155f136828601615543565b60208301525061560360408401615175565b604082015292915050565b5f8251615485818460208701615248565b601f82111561064557805f5260205f20601f840160051c810160208510156156445750805b601f840160051c820191505b8181101561189b575f8155600101615650565b81516001600160401b0381111561567c5761567c61548f565b6156908161568a8454615380565b8461561f565b602080601f8311600181146156c3575f84156156ac5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b828110156156f1578886015182559484019460019091019084016156d2565b508582101561570e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e5561571e565b5f63ffffffff80831681810361575d5761575d61571e565b6001019392505050565b8082028115828204841417610e5557610e5561571e565b5f8261579857634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157b1576157b1615220565b91905290565b6001600160401b038181168382160190808211156121b4576121b461571e565b5f60208083525f84546157e981615380565b806020870152604060018084165f811461580a576001811461582657615853565b60ff19851660408a0152604084151560051b8a01019550615853565b895f5260205f205f5b8581101561584a5781548b820186015290830190880161582f565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038281168282160390808211156121b4576121b461571e565b8051611ae881615053565b5f80604083850312156158ac575f80fd5b82516001600160401b03808211156158c2575f80fd5b90840190606082870312156158d5575f80fd5b6158dd6154a3565b825181526020808401516158f0816153e9565b82820152604084015183811115615905575f80fd5b80850194505087601f850112615919575f80fd5b835192506159296155608461551d565b838152888285870101111561593c575f80fd5b61594b84838301848801615248565b80604084015250819550615960818801615890565b9450505050509250929050565b81810381811115610e5557610e5561571e565b5f808335601e19843603018112615995575f80fd5b8301803591506001600160401b038211156159ae575f80fd5b6020019150368190038213156139b9575f80fd5b5f88516159d3818460208d01615248565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615a4e57615a4e61571e565b505092915050565b5f8235603e19833603018112615485575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615aa8575f80fd5b615ab06154cb565b615ab983615060565b81526020808401356001600160401b0380821115615ad5575f80fd5b9085019036601f830112615ae7575f80fd5b813581811115615af957615af961548f565b8060051b9150615b0a8483016154ed565b8181529183018401918481019036841115615b23575f80fd5b938501935b83851015615b4d5784359250615b3d836153e9565b8282529385019390850190615b28565b94860194909452509295945050505050565b5f60208284031215615b6f575f80fd5b6116b2826151a4565b5f60208284031215615b88575f80fd5b813560ff811681146116b2575f80fd5b5f6001600160401b0380831681810361575d5761575d61571e565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615bf981602a850160208b01615248565b865190830190615c1081602a840160208b01615248565b60c087901b6001600160c01b031916602a9290910191820152615c42603282018660e01b6001600160e01b0319169052565b615c5b603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c7e818460208801615248565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615cb4818460208901615248565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615cef818460208801615248565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 638762bcc..74e1d499c 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -599,6 +599,12 @@ abstract contract PoSValidatorManager is }); return (reward > 0); } else if (validator.status == ValidatorStatus.Completed) { + // To prevent churn tracker abuse, check that one full churn period has passed, + // so a delegator may not stake twice in the same churn period. + if (block.timestamp < delegator.startedAt + _getChurnPeriodSeconds()) { + revert MinStakeDurationNotPassed(uint64(block.timestamp)); + } + $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); _completeEndDelegation(delegationID); @@ -691,6 +697,11 @@ abstract contract PoSValidatorManager is revert InvalidDelegatorStatus(delegator.status); } + // Check that minimum stake duration has passed. + if (block.timestamp < delegator.startedAt + $._minimumStakeDuration) { + revert MinStakeDurationNotPassed(uint64(block.timestamp)); + } + if (getValidator(delegator.validationID).status != ValidatorStatus.Completed) { // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 93a5a63cc..eb5634a11 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -460,6 +460,44 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } + function testInitializeEndDelegationChurnPeriodSecondsNotPassed() public { + bytes32 validationID = _registerDefaultValidator(); + uint64 delegatorRegistrationTime = + DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION + 1; + bytes32 delegationID = _registerDelegator({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + initRegistrationTimestamp: delegatorRegistrationTime - 1, + completeRegistrationTimestamp: delegatorRegistrationTime, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + + _endValidationWithChecks({ + validationID: validationID, + validatorOwner: address(this), + completeRegistrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: delegatorRegistrationTime + 1, + validatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); + + uint64 invalidEndTime = delegatorRegistrationTime + DEFAULT_CHURN_PERIOD - 1; + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.MinStakeDurationNotPassed.selector, invalidEndTime + ) + ); + _initializeEndDelegation({ + sender: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + endDelegationTimestamp: invalidEndTime, + includeUptime: false, + force: false + }); + } + function testInitializeEndDelegationInsufficientUptime() public { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); From 749ca94ae80ebc03c02e7aed02e1a1aa2f154fba Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 24 Oct 2024 11:41:39 -0400 Subject: [PATCH 28/35] Remove redundant check --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 5 ----- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index f75e57a52..01f03d3b9 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516161fe3803806161fe83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160b18061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f3660046152cf565b6104b3565b005b61021461022436600461530a565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b6102146102563660046152cf565b6106f6565b610214610269366004615321565b610701565b61021461027c36600461536f565b610c2b565b61029461028f36600461530a565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d63660046152cf565b610cf9565b6102146102e9366004615390565b610d04565b6103016102fc3660046153d0565b610dc5565b60405190815260200161023f565b61021461031d366004615435565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461545d565b611065565b61029461036036600461530a565b61109c565b6103015f81565b61021461037a3660046152cf565b6110b0565b610231603081565b61021461039536600461530a565b6110db565b6102146103a8366004615435565b6111a6565b6103016103bb366004615476565b6113cf565b6102146103ce366004615390565b6113fb565b6103015f8051602061600583398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b36600461530a565b611584565b6103015f8051602061602583398151915281565b61021461044236600461530a565b61176d565b610231601481565b61046261045d36600461530a565b6118aa565b60405161023f919061550b565b6102946202a30081565b6103015f80516020615fe583398151915281565b61021461049b36600461559f565b6119f9565b6103016104ae3660046155dd565b611ad8565b6104be838383611b33565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160858339815191526020526040808220815160e0810190925280545f8051602061602583398151915293929190829060ff16600581111561053557610535615496565b600581111561054657610546615496565b815260200160018201805461055a90615648565b80601f016020809104026020016040519081016040528092919081815260200182805461058690615648565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615496565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615680565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611ef9565b6040518263ffffffff1660e01b81526004016106b0919061568e565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906156a0565b50505050565b6106f0838383611b33565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206160258339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906156a0565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f460608501604086016156b7565b6001600160a01b0316146108375761081260608401604085016156b7565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f61084560608501856156d2565b905090505f805b828163ffffffff161015610b2d575f61086860608801886156d2565b8363ffffffff1681811061087e5761087e615717565b9050602002810190610890919061572b565b6108999061584f565b80516040519192505f9160088801916108b1916158c8565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da919060040161568e565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a916158c8565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906156a0565b90508086600801835f015160405161098091906158c8565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615496565b021790555060208201516001820190610a1b908261591d565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac09116856159ec565b8251604051919550610ad1916158c8565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906159ff565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff1683615a21565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611f48565b6040015161205e565b90505f610b95876121eb565b90505f600282604051610ba891906158c8565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906156a0565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c34826123c5565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e836118aa565b5190506002816005811115610c7557610c75615496565b14610c95578060405163170cc93360e21b81526004016104da9190615680565b6106f08383612400565b5f805f8051602061600583398151915260030154610cbd9084615a38565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f083838361267a565b610d0c612866565b5f805160206160058339815191525f80610d258461289d565b91509150610d32826123c5565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c615496565b03610d91575f83815260088501602052604081208054919055610d8f8282612bdb565b505b610da781610da28460400151611065565b612c51565b505050505b610dc260015f8051602061606583398151915255565b50565b5f610dce612866565b610dda85858585612c87565b9050610df260015f8051602061606583398151915255565b949350505050565b5f8181525f805160206160458339815191526020526040808220815160e0810190925280545f8051602061600583398151915293929190829060ff166003811115610e4757610e47615496565b6003811115610e5857610e58615496565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece826118aa565b9050600183516003811115610ee557610ee5615496565b14610f06578251604051633b0d540d60e21b81526104da9190600401615a57565b600481516005811115610f1b57610f1b615496565b03610f3157610f2985612e60565b505050505050565b5f80610f48610f3f89611f48565b60400151613047565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b038416615a21565b5f6110a6826118aa565b6080015192915050565b6110bb83838361267a565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f805160206160058339815191525f6110f3836118aa565b519050600481600581111561110a5761110a615496565b1461112a578060405163170cc93360e21b81526004016104da9190615680565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612bdb565b6111ae612866565b5f8181525f805160206160458339815191526020526040808220815160e0810190925280545f8051602061600583398151915293929190829060ff1660038111156111fb576111fb615496565b600381111561120c5761120c615496565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128557611285615496565b146112a6578051604051633b0d540d60e21b81526104da9190600401615a57565b600282015460808201516112c3916001600160401b031690615a71565b6001600160401b03164210156112f75760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600461130682604001516118aa565b51600581111561131857611318615496565b146113aa575f61132785611f48565b90505f806113388360400151613047565b5091509150818460400151146113645760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b031611156113a657604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b6113b383612e60565b50506113cb60015f8051602061606583398151915255565b5050565b5f6113d8612866565b6113e383338461329d565b9050610cf360015f8051602061606583398151915255565b5f805160206160258339815191525f8061142061141785611f48565b60400151613575565b915091508061144657604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461146090615648565b90505f036114845760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff1660058111156114aa576114aa615496565b146114dd575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615680565b5f82815260068401602052604081206114f59161521e565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206160458339815191526020526040808220815160e0810190925280545f8051602061600583398151915293929190829060ff1660038111156115d1576115d1615496565b60038111156115e2576115e2615496565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561165b5761165b615496565b1415801561167c575060038151600381111561167957611679615496565b14155b1561169d578051604051633b0d540d60e21b81526104da9190600401615a57565b5f6116ab82604001516118aa565b905080606001516001600160401b03165f036116dd576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb61170a846040015184606001518560800151611ef9565b6040518263ffffffff1660e01b8152600401611726919061568e565b6020604051808303815f875af1158015611742573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176691906156a0565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061602583398151915291906117b490615648565b90505f036117d85760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117fe576117fe615496565b14611831575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615680565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161186a9190600401615a91565b6020604051808303815f875af1158015611886573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906156a0565b6118b2615255565b5f8281525f80516020616085833981519152602052604090819020815160e0810190925280545f80516020616025833981519152929190829060ff1660058111156118ff576118ff615496565b600581111561191057611910615496565b815260200160018201805461192490615648565b80601f016020809104026020016040519081016040528092919081815260200182805461195090615648565b801561199b5780601f106119725761010080835404028352916020019161199b565b820191905f5260205f20905b81548152906001019060200180831161197e57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a42575080546001600160401b03808416911610155b15611a605760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a8b8484613731565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020616025833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b1b9086908690615b1b565b90815260200160405180910390205491505092915050565b5f8381525f805160206160458339815191526020526040808220815160e0810190925280545f805160206160058339815191529284929091829060ff166003811115611b8157611b81615496565b6003811115611b9257611b92615496565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c08826118aa565b9050600283516003811115611c1f57611c1f615496565b14611c40578251604051633b0d540d60e21b81526104da9190600401615a57565b60208301516001600160a01b03163314611cdc575f8281526005850160205260409020546001600160a01b03163314611c79573361114b565b5f82815260058501602052604090205460a0820151611ca891600160b01b90046001600160401b031690615a71565b6001600160401b0316421015611cdc5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611cf157611cf1615496565b03611e1f5760028401546080840151611d13916001600160401b031690615a71565b6001600160401b0316421015611d475760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d5957611d578287612400565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d92918491611d8d9190615b2a565b61374b565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611dd3846138a2565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611ef29350505050565b600481516005811115611e3457611e34615496565b03611ed6577fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03168360800151611e739190615a71565b6001600160401b0316421015611ea75760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611eb0836138a2565b5f898152600786016020526040902055611ec988612e60565b6001945050505050611ef2565b805160405163170cc93360e21b81526104da9190600401615680565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fac573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fd39190810190615b55565b9150915080611ff557604051636b2f19e960e01b815260040160405180910390fd5b81511561201b578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615612057576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f815160261461209357815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b60028110156120e2576120aa816001615c27565b6120b5906008615a21565b61ffff168482815181106120cb576120cb615717565b016020015160f81c901b9190911790600101612096565b5061ffff81161561210c5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561216757612123816003615c27565b61212e906008615a21565b63ffffffff16856121408360026159ec565b8151811061215057612150615717565b016020015160f81c901b919091179060010161210f565b5063ffffffff81161561218d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121e2576121a481601f615c27565b6121af906008615a21565b866121bb8360066159ec565b815181106121cb576121cb615717565b016020015160f81c901b9190911790600101612190565b50949350505050565b60605f80833560208501356014612207878701604089016156b7565b61221460608901896156d2565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61229a60608501856156d2565b905081101561205757816122b160608601866156d2565b838181106122c1576122c1615717565b90506020028101906122d3919061572b565b6122dd9080615c3a565b90506122ec60608701876156d2565b848181106122fc576122fc615717565b905060200281019061230e919061572b565b6123189080615c3a565b61232560608901896156d2565b8681811061233557612335615717565b9050602002810190612347919061572b565b612355906020810190615c3a565b61236260608b018b6156d2565b8881811061237257612372615717565b9050602002810190612384919061572b565b61239590606081019060400161545d565b6040516020016123ab9796959493929190615c7c565b60408051601f19818403018152919052915060010161228d565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561244b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124729190810190615b55565b915091508061249457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fb91906156a0565b825114612521578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561255d576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061256c8460400151613a3f565b915091508187146125935760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020616005833981519152906001600160401b039081169083161115612650575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261266f565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206160058339815191528161269386613c30565b905061269e866123c5565b6126ad57600192505050611ef2565b5f8681526005830160205260409020546001600160a01b031633146126d2573361114b565b5f86815260058301602052604090205460a082015161270191600160b01b90046001600160401b031690615a71565b6001600160401b03168160c001516001600160401b031610156127485760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f8515612760576127598786612400565b905061277e565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127a390611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561280c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061283091906156a0565b905080846008015f8a81526020019081526020015f205f82825461285491906159ec565b90915550501515979650505050505050565b5f8051602061606583398151915280546001190161289757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128a6615255565b5f805160206160258339815191525f806128c261141787611f48565b9150915080156128e957604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561291a5761291a615496565b600581111561292b5761292b615496565b815260200160018201805461293f90615648565b80601f016020809104026020016040519081016040528092919081815260200182805461296b90615648565b80156129b65780601f1061298d576101008083540402835291602001916129b6565b820191905f5260205f20905b81548152906001019060200180831161299957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a2157612a21615496565b14158015612a425750600181516005811115612a3f57612a3f615496565b14155b15612a6357805160405163170cc93360e21b81526104da9190600401615680565b600381516005811115612a7857612a78615496565b03612a865760048152612a8b565b600581525b836008018160200151604051612aa191906158c8565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612ae557612ae5615496565b021790555060208201516001820190612afe908261591d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ba457612ba4615496565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615fe583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c36575f80fd5b505af1158015612c48573d5f803e3d5ffd5b50505050505050565b5f80516020615fe5833981519152546113cb906001600160a01b03168383613f14565b60015f8051602061606583398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061600583398151915290600160401b900461ffff9081169086161080612cdb575061271061ffff8616115b15612cff57604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612d3b576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612d4d5750806001015483115b15612d6e5760405163222d164360e21b8152600481018490526024016104da565b5f612d7884613f73565b90505f612d8482610c9f565b90505f612d918983613f96565b90506040518060800160405280612da53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f805160206160458339815191526020526040808220815160e0810190925280545f8051602061600583398151915293929190829060ff166003811115612ead57612ead615496565b6003811115612ebe57612ebe615496565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612fec575f84815260058701602052604090205461271090612f9e90600160a01b900461ffff1685615a21565b612fa89190615a38565b915081866008015f8681526020019081526020015f205f828254612fcc91906159ec565b90915550612fdc90508284615c27565b9050612fec856020015182612bdb565b6130018560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461307e57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b60028110156130cd57613095816001615c27565b6130a0906008615a21565b61ffff168682815181106130b6576130b6615717565b016020015160f81c901b9190911790600101613081565b5061ffff8116156130f75760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156131525761310e816003615c27565b613119906008615a21565b63ffffffff168761312b8360026159ec565b8151811061313b5761313b615717565b016020015160f81c901b91909117906001016130fa565b5063ffffffff811660031461317a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131cf5761319181601f615c27565b61319c906008615a21565b886131a88360066159ec565b815181106131b8576131b8615717565b016020015160f81c901b919091179060010161317d565b505f805b600881101561322e576131e7816007615c27565b6131f2906008615a21565b6001600160401b0316896132078360266159ec565b8151811061321757613217615717565b016020015160f81c901b91909117906001016131d3565b505f805b600881101561328d57613246816007615c27565b613251906008615a21565b6001600160401b03168a61326683602e6159ec565b8151811061327657613276615717565b016020015160f81c901b9190911790600101613232565b5091989097509095509350505050565b5f5f80516020616005833981519152816132b961028f85613f73565b90505f6132c5876118aa565b90506132d0876123c5565b6132f0576040516330efa98b60e01b8152600481018890526024016104da565b60028151600581111561330557613305615496565b1461332657805160405163170cc93360e21b81526104da9190600401615680565b5f8282608001516133379190615a71565b905083600201600a9054906101000a90046001600160401b031682604001516133609190615ce5565b6001600160401b0316816001600160401b0316111561339d57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806133a98a8461374b565b915091505f8a836040516020016133d792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561346a5761346a615496565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135ab57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156135fa576135c2816001615c27565b6135cd906008615a21565b61ffff168582815181106135e3576135e3615717565b016020015160f81c901b91909117906001016135ae565b5061ffff8116156136245760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561367f5761363b816003615c27565b613646906008615a21565b63ffffffff16866136588360026159ec565b8151811061366857613668615717565b016020015160f81c901b9190911790600101613627565b5063ffffffff81166002146136a757604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156136fc576136be81601f615c27565b6136c9906008615a21565b876136d58360066159ec565b815181106136e5576136e5615717565b016020015160f81c901b91909117906001016136aa565b505f8660268151811061371157613711615717565b016020015191976001600160f81b03199092161515965090945050505050565b61373961450e565b61374282614559565b6113cb816145cd565b5f8281525f80516020616085833981519152602052604081206002015481905f8051602061602583398151915290600160801b90046001600160401b03166137938582614635565b5f61379d87614858565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137ed8a858b611ef9565b6040518263ffffffff1660e01b8152600401613809919061568e565b6020604051808303815f875af1158015613825573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061384991906156a0565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061600583398151915290505f6138c284604001516118aa565b90505f6003825160058111156138da576138da615496565b14806138f857506004825160058111156138f6576138f6615496565b145b15613908575060c0810151613945565b60028251600581111561391d5761391d615496565b03613929575042613945565b815160405163170cc93360e21b81526104da9190600401615680565b84608001516001600160401b0316816001600160401b03161161396c57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061399190611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a3691906156a0565b95945050505050565b5f808251602e14613a7557825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613ac457613a8c816001615c27565b613a97906008615a21565b61ffff16858281518110613aad57613aad615717565b016020015160f81c901b9190911790600101613a78565b5061ffff811615613aee5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613b4957613b05816003615c27565b613b10906008615a21565b63ffffffff1686613b228360026159ec565b81518110613b3257613b32615717565b016020015160f81c901b9190911790600101613af1565b5063ffffffff811615613b6f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bc457613b8681601f615c27565b613b91906008615a21565b87613b9d8360066159ec565b81518110613bad57613bad615717565b016020015160f81c901b9190911790600101613b72565b505f805b6008811015613c2357613bdc816007615c27565b613be7906008615a21565b6001600160401b031688613bfc8360266159ec565b81518110613c0c57613c0c615717565b016020015160f81c901b9190911790600101613bc8565b5090969095509350505050565b613c38615255565b5f8281525f805160206160858339815191526020526040808220815160e0810190925280545f8051602061602583398151915293929190829060ff166005811115613c8557613c85615496565b6005811115613c9657613c96615496565b8152602001600182018054613caa90615648565b80601f0160208091040260200160405190810160405280929190818152602001828054613cd690615648565b8015613d215780601f10613cf857610100808354040283529160200191613d21565b820191905f5260205f20905b815481529060010190602001808311613d0457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d8f57613d8f615496565b14613dc2575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff1690600401615680565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e0657613e06615496565b021790555060208201516001820190613e1f908261591d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ebd858261374b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506148cd565b5f610cf3825f80516020615fe5833981519152546001600160a01b03169061492e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fda57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061602583398151915242613ff9606086016040870161545d565b6001600160401b031611158061403357506140176202a300426159ec565b614027606086016040870161545d565b6001600160401b031610155b1561406d57614048606085016040860161545d565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b61408261407d6060860186615d10565b614a87565b61409261407d6080860186615d10565b60306140a16020860186615c3a565b9050146140d3576140b56020850185615c3a565b6040516326475b2f60e11b81526104da925060040190815260200190565b6140dd8480615c3a565b90505f0361410a576140ef8480615c3a565b604051633e08a12560e11b81526004016104da929190615d24565b5f600882016141198680615c3a565b604051614127929190615b1b565b90815260200160405180910390205414614160576141458480615c3a565b60405163a41f772f60e01b81526004016104da929190615d24565b61416a835f614635565b6040805160e08101909152815481525f908190614276906020810161418f8980615c3a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141d7908a018a615c3a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161422060608a0160408b0161545d565b6001600160401b0316815260200161423b60608a018a615d10565b61424490615d52565b815260200161425660808a018a615d10565b61425f90615d52565b8152602001876001600160401b0316815250614bf0565b5f82815260068601602052604090209193509150614294828261591d565b5081600884016142a48880615c3a565b6040516142b2929190615b1b565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142ee90859060040161568e565b6020604051808303815f875af115801561430a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061432e91906156a0565b6040805160e08101909152909150806001815260200161434e8980615c3a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143dd576143dd615496565b0217905550602082015160018201906143f6908261591d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144948880615c3a565b6040516144a2929190615b1b565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144e0919061545d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661455757604051631afcd79f60e31b815260040160405180910390fd5b565b61456161450e565b61456a81614ddd565b614572614df6565b610dc26060820135608083013561458f60c0850160a0860161545d565b61459f60e0860160c08701615e19565b6145b0610100870160e08801615e32565b6101008701356145c861014089016101208a016156b7565b614e06565b6145d561450e565b5f80516020615fe58339815191526001600160a01b03821661461557604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f805160206160258339815191525f6001600160401b038084169085161115614669576146628385615b2a565b9050614676565b6146738484615b2a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146d85750600184015481516146d4916001600160401b0316906159ec565b8210155b156146fe576001600160401b03831660608201528181526040810151602082015261471d565b82816060018181516147109190615a71565b6001600160401b03169052505b606081015161472d906064615ce5565b602082015160018601546001600160401b0392909216916147589190600160401b900460ff16615a21565b101561478857606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516147a391906159ec565b9052506040810180516001600160401b03871691906147c3908390615c27565b905250600184015460408201516064916147e891600160401b90910460ff1690615a21565b101561480f578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160858339815191526020526040812060020180545f8051602061602583398151915291906008906148a290600160401b90046001600160401b0316615e52565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6148e16001600160a01b03841683614fc2565b905080515f141580156149055750808060200190518101906149039190615e6d565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614974573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061499891906156a0565b90506149af6001600160a01b038516333086614fcf565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156149f3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a1791906156a0565b9050818111614a7d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b613a368282615c27565b614a946020820182615390565b63ffffffff16158015614ab45750614aaf60208201826156d2565b151590505b15614afb57614ac66020820182615390565b614ad360208301836156d2565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614b0860208201826156d2565b9050614b176020830183615390565b63ffffffff161115614b3057614ac66020820182615390565b60015b614b4060208301836156d2565b90508110156113cb57614b5660208301836156d2565b614b61600184615c27565b818110614b7057614b70615717565b9050602002016020810190614b8591906156b7565b6001600160a01b0316614b9b60208401846156d2565b83818110614bab57614bab615717565b9050602002016020810190614bc091906156b7565b6001600160a01b03161015614be857604051630dbc8d5f60e31b815260040160405180910390fd5b600101614b33565b5f6060826040015151603014614c195760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614c5a988a986001989297929690959094909390929101615e88565b60405160208183030381529060405290505f5b84608001516020015151811015614ccc57818560800151602001518281518110614c9957614c99615717565b6020026020010151604051602001614cb2929190615f42565b60408051601f198184030181529190529150600101614c6d565b5060a0840151805160209182015151604051614cec938593929101615f78565b60405160208183030381529060405290505f5b8460a001516020015151811015614d5e57818560a00151602001518281518110614d2b57614d2b615717565b6020026020010151604051602001614d44929190615f42565b60408051601f198184030181529190529150600101614cff565b5060c0840151604051614d75918391602001615fb3565b6040516020818303038152906040529050600281604051614d9691906158c8565b602060405180830381855afa158015614db1573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dd491906156a0565b94909350915050565b614de561450e565b614ded615008565b610dc281615010565b614dfe61450e565b6145576150f8565b614e0e61450e565b5f8051602061600583398151915261ffff85161580614e32575061271061ffff8616115b15614e5657604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614e7a5760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614e8d5750600a60ff8516115b15614eb05760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614f17576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614f375760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611ef283835f615100565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613f41565b61455761450e565b61501861450e565b80355f80516020616025833981519152908155601461503d6060840160408501615e32565b60ff16118061505c57506150576060830160408401615e32565b60ff16155b15615090576150716060830160408401615e32565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b6150a06060830160408401615e32565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556150d1604083016020840161545d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c7461450e565b6060814710156151255760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b0316848660405161514091906158c8565b5f6040518083038185875af1925050503d805f811461517a576040519150601f19603f3d011682016040523d82523d5f602084013e61517f565b606091505b509150915061518f868383615199565b9695505050505050565b6060826151ae576151a9826151f5565b611ef2565b81511580156151c557506001600160a01b0384163b155b156151ee57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611ef2565b8051156152055780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461522a90615648565b5f825580601f10615239575050565b601f0160209004905f5260205f2090810190610dc29190615292565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156152a6575f8155600101615293565b5090565b8015158114610dc2575f80fd5b803563ffffffff811681146152ca575f80fd5b919050565b5f805f606084860312156152e1575f80fd5b8335925060208401356152f3816152aa565b9150615301604085016152b7565b90509250925092565b5f6020828403121561531a575f80fd5b5035919050565b5f8060408385031215615332575f80fd5b82356001600160401b03811115615347575f80fd5b830160808186031215615358575f80fd5b9150615366602084016152b7565b90509250929050565b5f8060408385031215615380575f80fd5b82359150615366602084016152b7565b5f602082840312156153a0575f80fd5b611ef2826152b7565b803561ffff811681146152ca575f80fd5b80356001600160401b03811681146152ca575f80fd5b5f805f80608085870312156153e3575f80fd5b84356001600160401b038111156153f8575f80fd5b850160a08188031215615409575f80fd5b9350615417602086016153a9565b9250615425604086016153ba565b9396929550929360600135925050565b5f8060408385031215615446575f80fd5b61544f836152b7565b946020939093013593505050565b5f6020828403121561546d575f80fd5b611ef2826153ba565b5f8060408385031215615487575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106154ba576154ba615496565b9052565b5f5b838110156154d85781810151838201526020016154c0565b50505f910152565b5f81518084526154f78160208601602086016154be565b601f01601f19169290920160200192915050565b6020815261551d6020820183516154aa565b5f602083015160e060408401526155386101008401826154e0565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f808284036101608112156155b2575f80fd5b610140808212156155c1575f80fd5b84935083013590506155d28161558b565b809150509250929050565b5f80602083850312156155ee575f80fd5b82356001600160401b0380821115615604575f80fd5b818501915085601f830112615617575f80fd5b813581811115615625575f80fd5b866020828501011115615636575f80fd5b60209290920196919550909350505050565b600181811c9082168061565c57607f821691505b60208210810361567a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf382846154aa565b602081525f611ef260208301846154e0565b5f602082840312156156b0575f80fd5b5051919050565b5f602082840312156156c7575f80fd5b8135611ef28161558b565b5f808335601e198436030181126156e7575f80fd5b8301803591506001600160401b03821115615700575f80fd5b6020019150600581901b360382131561389b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261573f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561577f5761577f615749565b60405290565b604080519081016001600160401b038111828210171561577f5761577f615749565b604051601f8201601f191681016001600160401b03811182821017156157cf576157cf615749565b604052919050565b5f6001600160401b038211156157ef576157ef615749565b50601f01601f191660200190565b5f82601f83011261580c575f80fd5b813561581f61581a826157d7565b6157a7565b818152846020838601011115615833575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561585f575f80fd5b61586761575d565b82356001600160401b038082111561587d575f80fd5b615889368387016157fd565b8352602085013591508082111561589e575f80fd5b506158ab368286016157fd565b6020830152506158bd604084016153ba565b604082015292915050565b5f825161573f8184602087016154be565b601f8211156104e357805f5260205f20601f840160051c810160208510156158fe5750805b601f840160051c820191505b81811015611766575f815560010161590a565b81516001600160401b0381111561593657615936615749565b61594a816159448454615648565b846158d9565b602080601f83116001811461597d575f84156159665750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b828110156159ab5788860151825594840194600190910190840161598c565b50858210156159c857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf36159d8565b5f63ffffffff808316818103615a1757615a176159d8565b6001019392505050565b8082028115828204841417610cf357610cf36159d8565b5f82615a5257634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a6b57615a6b615496565b91905290565b6001600160401b03818116838216019080821115612057576120576159d8565b5f60208083525f8454615aa381615648565b806020870152604060018084165f8114615ac45760018114615ae057615b0d565b60ff19851660408a0152604084151560051b8a01019550615b0d565b895f5260205f205f5b85811015615b045781548b8201860152908301908801615ae9565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115612057576120576159d8565b80516152ca816152aa565b5f8060408385031215615b66575f80fd5b82516001600160401b0380821115615b7c575f80fd5b9084019060608287031215615b8f575f80fd5b615b9761575d565b82518152602080840151615baa8161558b565b82820152604084015183811115615bbf575f80fd5b80850194505087601f850112615bd3575f80fd5b83519250615be361581a846157d7565b8381528882858701011115615bf6575f80fd5b615c05848383018488016154be565b80604084015250819550615c1a818801615b4a565b9450505050509250929050565b81810381811115610cf357610cf36159d8565b5f808335601e19843603018112615c4f575f80fd5b8301803591506001600160401b03821115615c68575f80fd5b60200191503681900382131561389b575f80fd5b5f8851615c8d818460208d016154be565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615d0857615d086159d8565b505092915050565b5f8235603e1983360301811261573f575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d62575f80fd5b615d6a615785565b615d73836152b7565b81526020808401356001600160401b0380821115615d8f575f80fd5b9085019036601f830112615da1575f80fd5b813581811115615db357615db3615749565b8060051b9150615dc48483016157a7565b8181529183018401918481019036841115615ddd575f80fd5b938501935b83851015615e075784359250615df78361558b565b8282529385019390850190615de2565b94860194909452509295945050505050565b5f60208284031215615e29575f80fd5b611ef2826153a9565b5f60208284031215615e42575f80fd5b813560ff81168114611ef2575f80fd5b5f6001600160401b03808316818103615a1757615a176159d8565b5f60208284031215615e7d575f80fd5b8151611ef2816152aa565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615ece81602a850160208b016154be565b865190830190615ee581602a840160208b016154be565b60c087901b6001600160c01b031916602a9290910191820152615f17603282018660e01b6001600160e01b0319169052565b615f30603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f538184602088016154be565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f898184602089016154be565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615fc48184602088016154be565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516161ad3803806161ad83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160608061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f36600461527e565b6104b3565b005b6102146102243660046152b9565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b61021461025636600461527e565b6106f6565b6102146102693660046152d0565b610701565b61021461027c36600461531e565b610c2b565b61029461028f3660046152b9565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d636600461527e565b610cf9565b6102146102e936600461533f565b610d04565b6103016102fc36600461537f565b610dc5565b60405190815260200161023f565b61021461031d3660046153e4565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461540c565b611065565b6102946103603660046152b9565b61109c565b6103015f81565b61021461037a36600461527e565b6110b0565b610231603081565b6102146103953660046152b9565b6110db565b6102146103a83660046153e4565b6111a6565b6103016103bb366004615425565b61137e565b6102146103ce36600461533f565b6113aa565b6103015f80516020615fb483398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b3660046152b9565b611533565b6103015f80516020615fd483398151915281565b6102146104423660046152b9565b61171c565b610231601481565b61046261045d3660046152b9565b611859565b60405161023f91906154ba565b6102946202a30081565b6103015f80516020615f9483398151915281565b61021461049b36600461554e565b6119a8565b6103016104ae36600461558c565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160348339815191526020526040808220815160e0810190925280545f80516020615fd483398151915293929190829060ff16600581111561053557610535615445565b600581111561054657610546615445565b815260200160018201805461055a906155f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906155f7565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615445565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562f565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611ea8565b6040518263ffffffff1660e01b81526004016106b0919061563d565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061564f565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615fd48339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba919061564f565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615666565b6001600160a01b031614610837576108126060840160408501615666565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615681565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615681565b8363ffffffff1681811061087e5761087e6156c6565b905060200281019061089091906156da565b610899906157fe565b80516040519192505f9160088801916108b191615877565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da919060040161563d565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615877565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610968919061564f565b90508086600801835f01516040516109809190615877565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615445565b021790555060208201516001820190610a1b90826158cc565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561599b565b8251604051919550610ad191615877565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906159ae565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836159d0565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611ef7565b6040015161200d565b90505f610b958761219a565b90505f600282604051610ba89190615877565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be6919061564f565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612374565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c75615445565b14610c95578060405163170cc93360e21b81526004016104da919061562f565b6106f083836123af565b5f805f80516020615fb483398151915260030154610cbd90846159e7565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f0838383612629565b610d0c612815565b5f80516020615fb48339815191525f80610d258461284c565b91509150610d3282612374565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c615445565b03610d91575f83815260088501602052604081208054919055610d8f8282612b8a565b505b610da781610da28460400151611065565b612c00565b505050505b610dc260015f8051602061601483398151915255565b50565b5f610dce612815565b610dda85858585612c36565b9050610df260015f8051602061601483398151915255565b949350505050565b5f8181525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb483398151915293929190829060ff166003811115610e4757610e47615445565b6003811115610e5857610e58615445565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee5615445565b14610f06578251604051633b0d540d60e21b81526104da9190600401615a06565b600481516005811115610f1b57610f1b615445565b03610f3157610f2985612e0f565b505050505050565b5f80610f48610f3f89611ef7565b60400151612ff6565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b0384166159d0565b5f6110a682611859565b6080015192915050565b6110bb838383612629565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615fb48339815191525f6110f383611859565b519050600481600581111561110a5761110a615445565b1461112a578060405163170cc93360e21b81526004016104da919061562f565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612b8a565b6111ae612815565b5f8181525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb483398151915293929190829060ff1660038111156111fb576111fb615445565b600381111561120c5761120c615445565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128557611285615445565b146112a6578051604051633b0d540d60e21b81526104da9190600401615a06565b60046112b58260400151611859565b5160058111156112c7576112c7615445565b14611359575f6112d685611ef7565b90505f806112e78360400151612ff6565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612e0f565b505061137a60015f8051602061601483398151915255565b5050565b5f611387612815565b61139283338461324c565b9050610cf360015f8051602061601483398151915255565b5f80516020615fd48339815191525f806113cf6113c685611ef7565b60400151613524565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f906155f7565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff16600581111561145957611459615445565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562f565b5f82815260068401602052604081206114a4916151cd565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb483398151915293929190829060ff16600381111561158057611580615445565b600381111561159157611591615445565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a615445565b1415801561162b575060038151600381111561162857611628615445565b14155b1561164c578051604051633b0d540d60e21b81526104da9190600401615a06565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611ea8565b6040518263ffffffff1660e01b81526004016116d5919061563d565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611715919061564f565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615fd48339815191529190611763906155f7565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad615445565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562f565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118199190600401615a20565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e3919061564f565b611861615204565b5f8281525f80516020616034833981519152602052604090819020815160e0810190925280545f80516020615fd4833981519152929190829060ff1660058111156118ae576118ae615445565b60058111156118bf576118bf615445565b81526020016001820180546118d3906155f7565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff906155f7565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a84846136e0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615fd4833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca9086908690615aaa565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb48339815191529284929091829060ff166003811115611b3057611b30615445565b6003811115611b4157611b41615445565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce615445565b14611bef578251604051633b0d540d60e21b81526104da9190600401615a06565b60208301516001600160a01b03163314611c8b575f8281526005850160205260409020546001600160a01b03163314611c28573361114b565b5f82815260058501602052604090205460a0820151611c5791600160b01b90046001600160401b031690615ab9565b6001600160401b0316421015611c8b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca057611ca0615445565b03611dce5760028401546080840151611cc2916001600160401b031690615ab9565b6001600160401b0316421015611cf65760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d0857611d0682876123af565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d41918491611d3c9190615ad9565b6136fa565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d8284613851565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611ea19350505050565b600481516005811115611de357611de3615445565b03611e85577fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03168360800151611e229190615ab9565b6001600160401b0316421015611e565760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611e5f83613851565b5f898152600786016020526040902055611e7888612e0f565b6001945050505050611ea1565b805160405163170cc93360e21b81526104da919060040161562f565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f829190810190615b04565b9150915080611fa457604051636b2f19e960e01b815260040160405180910390fd5b815115611fca578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615612006576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f815160261461204257815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561209157612059816001615bd6565b6120649060086159d0565b61ffff1684828151811061207a5761207a6156c6565b016020015160f81c901b9190911790600101612045565b5061ffff8116156120bb5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015612116576120d2816003615bd6565b6120dd9060086159d0565b63ffffffff16856120ef83600261599b565b815181106120ff576120ff6156c6565b016020015160f81c901b91909117906001016120be565b5063ffffffff81161561213c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121915761215381601f615bd6565b61215e9060086159d0565b8661216a83600661599b565b8151811061217a5761217a6156c6565b016020015160f81c901b919091179060010161213f565b50949350505050565b60605f808335602085013560146121b687870160408901615666565b6121c36060890189615681565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6122496060850185615681565b905081101561200657816122606060860186615681565b83818110612270576122706156c6565b905060200281019061228291906156da565b61228c9080615be9565b905061229b6060870187615681565b848181106122ab576122ab6156c6565b90506020028101906122bd91906156da565b6122c79080615be9565b6122d46060890189615681565b868181106122e4576122e46156c6565b90506020028101906122f691906156da565b612304906020810190615be9565b61231160608b018b615681565b88818110612321576123216156c6565b905060200281019061233391906156da565b61234490606081019060400161540c565b60405160200161235a9796959493929190615c2b565b60408051601f19818403018152919052915060010161223c565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156123fa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124219190810190615b04565b915091508061244357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612486573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124aa919061564f565b8251146124d0578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561250c576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061251b84604001516139ee565b915091508187146125425760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615fb4833981519152906001600160401b0390811690831611156125ff575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261261e565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615fb48339815191528161264286613bdf565b905061264d86612374565b61265c57600192505050611ea1565b5f8681526005830160205260409020546001600160a01b03163314612681573361114b565b5f86815260058301602052604090205460a08201516126b091600160b01b90046001600160401b031690615ab9565b6001600160401b03168160c001516001600160401b031610156126f75760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f851561270f5761270887866123af565b905061272d565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061275290611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156127bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127df919061564f565b905080846008015f8a81526020019081526020015f205f828254612803919061599b565b90915550501515979650505050505050565b5f8051602061601483398151915280546001190161284657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612855615204565b5f80516020615fd48339815191525f806128716113c687611ef7565b91509150801561289857604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128c9576128c9615445565b60058111156128da576128da615445565b81526020016001820180546128ee906155f7565b80601f016020809104026020016040519081016040528092919081815260200182805461291a906155f7565b80156129655780601f1061293c57610100808354040283529160200191612965565b820191905f5260205f20905b81548152906001019060200180831161294857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129d0576129d0615445565b141580156129f157506001815160058111156129ee576129ee615445565b14155b15612a1257805160405163170cc93360e21b81526104da919060040161562f565b600381516005811115612a2757612a27615445565b03612a355760048152612a3a565b600581525b836008018160200151604051612a509190615877565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a9457612a94615445565b021790555060208201516001820190612aad90826158cc565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b5357612b53615445565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615f9483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612be5575f80fd5b505af1158015612bf7573d5f803e3d5ffd5b50505050505050565b5f80516020615f948339815191525461137a906001600160a01b03168383613ec3565b60015f8051602061601483398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615fb483398151915290600160401b900461ffff9081169086161080612c8a575061271061ffff8616115b15612cae57604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612cea576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612cfc5750806001015483115b15612d1d5760405163222d164360e21b8152600481018490526024016104da565b5f612d2784613f22565b90505f612d3382610c9f565b90505f612d408983613f45565b90506040518060800160405280612d543390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb483398151915293929190829060ff166003811115612e5c57612e5c615445565b6003811115612e6d57612e6d615445565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612f9b575f84815260058701602052604090205461271090612f4d90600160a01b900461ffff16856159d0565b612f5791906159e7565b915081866008015f8681526020019081526020015f205f828254612f7b919061599b565b90915550612f8b90508284615bd6565b9050612f9b856020015182612b8a565b612fb08560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461302d57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b600281101561307c57613044816001615bd6565b61304f9060086159d0565b61ffff16868281518110613065576130656156c6565b016020015160f81c901b9190911790600101613030565b5061ffff8116156130a65760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613101576130bd816003615bd6565b6130c89060086159d0565b63ffffffff16876130da83600261599b565b815181106130ea576130ea6156c6565b016020015160f81c901b91909117906001016130a9565b5063ffffffff811660031461312957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561317e5761314081601f615bd6565b61314b9060086159d0565b8861315783600661599b565b81518110613167576131676156c6565b016020015160f81c901b919091179060010161312c565b505f805b60088110156131dd57613196816007615bd6565b6131a19060086159d0565b6001600160401b0316896131b683602661599b565b815181106131c6576131c66156c6565b016020015160f81c901b9190911790600101613182565b505f805b600881101561323c576131f5816007615bd6565b6132009060086159d0565b6001600160401b03168a61321583602e61599b565b81518110613225576132256156c6565b016020015160f81c901b91909117906001016131e1565b5091989097509095509350505050565b5f5f80516020615fb48339815191528161326861028f85613f22565b90505f61327487611859565b905061327f87612374565b61329f576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156132b4576132b4615445565b146132d557805160405163170cc93360e21b81526104da919060040161562f565b5f8282608001516132e69190615ab9565b905083600201600a9054906101000a90046001600160401b0316826040015161330f9190615c94565b6001600160401b0316816001600160401b0316111561334c57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806133588a846136fa565b915091505f8a8360405160200161338692919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561341957613419615445565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461355a57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156135a957613571816001615bd6565b61357c9060086159d0565b61ffff16858281518110613592576135926156c6565b016020015160f81c901b919091179060010161355d565b5061ffff8116156135d35760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561362e576135ea816003615bd6565b6135f59060086159d0565b63ffffffff168661360783600261599b565b81518110613617576136176156c6565b016020015160f81c901b91909117906001016135d6565b5063ffffffff811660021461365657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156136ab5761366d81601f615bd6565b6136789060086159d0565b8761368483600661599b565b81518110613694576136946156c6565b016020015160f81c901b9190911790600101613659565b505f866026815181106136c0576136c06156c6565b016020015191976001600160f81b03199092161515965090945050505050565b6136e86144bd565b6136f182614508565b61137a8161457c565b5f8281525f80516020616034833981519152602052604081206002015481905f80516020615fd483398151915290600160801b90046001600160401b031661374285826145e4565b5f61374c87614807565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61379c8a858b611ea8565b6040518263ffffffff1660e01b81526004016137b8919061563d565b6020604051808303815f875af11580156137d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137f8919061564f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615fb483398151915290505f6138718460400151611859565b90505f60038251600581111561388957613889615445565b14806138a757506004825160058111156138a5576138a5615445565b145b156138b7575060c08101516138f4565b6002825160058111156138cc576138cc615445565b036138d85750426138f4565b815160405163170cc93360e21b81526104da919060040161562f565b84608001516001600160401b0316816001600160401b03161161391b57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061394090611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156139c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139e5919061564f565b95945050505050565b5f808251602e14613a2457825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613a7357613a3b816001615bd6565b613a469060086159d0565b61ffff16858281518110613a5c57613a5c6156c6565b016020015160f81c901b9190911790600101613a27565b5061ffff811615613a9d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613af857613ab4816003615bd6565b613abf9060086159d0565b63ffffffff1686613ad183600261599b565b81518110613ae157613ae16156c6565b016020015160f81c901b9190911790600101613aa0565b5063ffffffff811615613b1e57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7357613b3581601f615bd6565b613b409060086159d0565b87613b4c83600661599b565b81518110613b5c57613b5c6156c6565b016020015160f81c901b9190911790600101613b21565b505f805b6008811015613bd257613b8b816007615bd6565b613b969060086159d0565b6001600160401b031688613bab83602661599b565b81518110613bbb57613bbb6156c6565b016020015160f81c901b9190911790600101613b77565b5090969095509350505050565b613be7615204565b5f8281525f805160206160348339815191526020526040808220815160e0810190925280545f80516020615fd483398151915293929190829060ff166005811115613c3457613c34615445565b6005811115613c4557613c45615445565b8152602001600182018054613c59906155f7565b80601f0160208091040260200160405190810160405280929190818152602001828054613c85906155f7565b8015613cd05780601f10613ca757610100808354040283529160200191613cd0565b820191905f5260205f20905b815481529060010190602001808311613cb357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d3e57613d3e615445565b14613d71575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562f565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613db557613db5615445565b021790555060208201516001820190613dce90826158cc565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e6c85826136fa565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061487c565b5f610cf3825f80516020615f94833981519152546001600160a01b0316906148dd565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f8957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615fd483398151915242613fa8606086016040870161540c565b6001600160401b0316111580613fe25750613fc66202a3004261599b565b613fd6606086016040870161540c565b6001600160401b031610155b1561401c57613ff7606085016040860161540c565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b61403161402c6060860186615cbf565b614a36565b61404161402c6080860186615cbf565b60306140506020860186615be9565b905014614082576140646020850185615be9565b6040516326475b2f60e11b81526104da925060040190815260200190565b61408c8480615be9565b90505f036140b95761409e8480615be9565b604051633e08a12560e11b81526004016104da929190615cd3565b5f600882016140c88680615be9565b6040516140d6929190615aaa565b9081526020016040518091039020541461410f576140f48480615be9565b60405163a41f772f60e01b81526004016104da929190615cd3565b614119835f6145e4565b6040805160e08101909152815481525f908190614225906020810161413e8980615be9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614186908a018a615be9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141cf60608a0160408b0161540c565b6001600160401b031681526020016141ea60608a018a615cbf565b6141f390615d01565b815260200161420560808a018a615cbf565b61420e90615d01565b8152602001876001600160401b0316815250614b9f565b5f8281526006860160205260409020919350915061424382826158cc565b5081600884016142538880615be9565b604051614261929190615aaa565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061429d90859060040161563d565b6020604051808303815f875af11580156142b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142dd919061564f565b6040805160e0810190915290915080600181526020016142fd8980615be9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561438c5761438c615445565b0217905550602082015160018201906143a590826158cc565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144438880615be9565b604051614451929190615aaa565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061448f919061540c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661450657604051631afcd79f60e31b815260040160405180910390fd5b565b6145106144bd565b61451981614d8c565b614521614da5565b610dc26060820135608083013561453e60c0850160a0860161540c565b61454e60e0860160c08701615dc8565b61455f610100870160e08801615de1565b61010087013561457761014089016101208a01615666565b614db5565b6145846144bd565b5f80516020615f948339815191526001600160a01b0382166145c457604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615fd48339815191525f6001600160401b038084169085161115614618576146118385615ad9565b9050614625565b6146228484615ad9565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614687575060018401548151614683916001600160401b03169061599b565b8210155b156146ad576001600160401b0383166060820152818152604081015160208201526146cc565b82816060018181516146bf9190615ab9565b6001600160401b03169052505b60608101516146dc906064615c94565b602082015160018601546001600160401b0392909216916147079190600160401b900460ff166159d0565b101561473757606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b031681604001818151614752919061599b565b9052506040810180516001600160401b0387169190614772908390615bd6565b9052506001840154604082015160649161479791600160401b90910460ff16906159d0565b10156147be578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160348339815191526020526040812060020180545f80516020615fd4833981519152919060089061485190600160401b90046001600160401b0316615e01565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6148906001600160a01b03841683614f71565b905080515f141580156148b45750808060200190518101906148b29190615e1c565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614923573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614947919061564f565b905061495e6001600160a01b038516333086614f7e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156149a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149c6919061564f565b9050818111614a2c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139e58282615bd6565b614a43602082018261533f565b63ffffffff16158015614a635750614a5e6020820182615681565b151590505b15614aaa57614a75602082018261533f565b614a826020830183615681565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614ab76020820182615681565b9050614ac6602083018361533f565b63ffffffff161115614adf57614a75602082018261533f565b60015b614aef6020830183615681565b905081101561137a57614b056020830183615681565b614b10600184615bd6565b818110614b1f57614b1f6156c6565b9050602002016020810190614b349190615666565b6001600160a01b0316614b4a6020840184615681565b83818110614b5a57614b5a6156c6565b9050602002016020810190614b6f9190615666565b6001600160a01b03161015614b9757604051630dbc8d5f60e31b815260040160405180910390fd5b600101614ae2565b5f6060826040015151603014614bc85760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614c09988a986001989297929690959094909390929101615e37565b60405160208183030381529060405290505f5b84608001516020015151811015614c7b57818560800151602001518281518110614c4857614c486156c6565b6020026020010151604051602001614c61929190615ef1565b60408051601f198184030181529190529150600101614c1c565b5060a0840151805160209182015151604051614c9b938593929101615f27565b60405160208183030381529060405290505f5b8460a001516020015151811015614d0d57818560a00151602001518281518110614cda57614cda6156c6565b6020026020010151604051602001614cf3929190615ef1565b60408051601f198184030181529190529150600101614cae565b5060c0840151604051614d24918391602001615f62565b6040516020818303038152906040529050600281604051614d459190615877565b602060405180830381855afa158015614d60573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d83919061564f565b94909350915050565b614d946144bd565b614d9c614fb7565b610dc281614fbf565b614dad6144bd565b6145066150a7565b614dbd6144bd565b5f80516020615fb483398151915261ffff85161580614de1575061271061ffff8616115b15614e0557604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614e295760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614e3c5750600a60ff8516115b15614e5f5760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614ec6576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614ee65760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611ea183835f6150af565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613ef0565b6145066144bd565b614fc76144bd565b80355f80516020615fd48339815191529081556014614fec6060840160408501615de1565b60ff16118061500b57506150066060830160408401615de1565b60ff16155b1561503f576150206060830160408401615de1565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b61504f6060830160408401615de1565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615080604083016020840161540c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c236144bd565b6060814710156150d45760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b031684866040516150ef9190615877565b5f6040518083038185875af1925050503d805f8114615129576040519150601f19603f3d011682016040523d82523d5f602084013e61512e565b606091505b509150915061513e868383615148565b9695505050505050565b60608261515d57615158826151a4565b611ea1565b815115801561517457506001600160a01b0384163b155b1561519d57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611ea1565b8051156151b45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151d9906155f7565b5f825580601f106151e8575050565b601f0160209004905f5260205f2090810190610dc29190615241565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615255575f8155600101615242565b5090565b8015158114610dc2575f80fd5b803563ffffffff81168114615279575f80fd5b919050565b5f805f60608486031215615290575f80fd5b8335925060208401356152a281615259565b91506152b060408501615266565b90509250925092565b5f602082840312156152c9575f80fd5b5035919050565b5f80604083850312156152e1575f80fd5b82356001600160401b038111156152f6575f80fd5b830160808186031215615307575f80fd5b915061531560208401615266565b90509250929050565b5f806040838503121561532f575f80fd5b8235915061531560208401615266565b5f6020828403121561534f575f80fd5b611ea182615266565b803561ffff81168114615279575f80fd5b80356001600160401b0381168114615279575f80fd5b5f805f8060808587031215615392575f80fd5b84356001600160401b038111156153a7575f80fd5b850160a081880312156153b8575f80fd5b93506153c660208601615358565b92506153d460408601615369565b9396929550929360600135925050565b5f80604083850312156153f5575f80fd5b6153fe83615266565b946020939093013593505050565b5f6020828403121561541c575f80fd5b611ea182615369565b5f8060408385031215615436575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061546957615469615445565b9052565b5f5b8381101561548757818101518382015260200161546f565b50505f910152565b5f81518084526154a681602086016020860161546d565b601f01601f19169290920160200192915050565b602081526154cc602082018351615459565b5f602083015160e060408401526154e761010084018261548f565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f80828403610160811215615561575f80fd5b61014080821215615570575f80fd5b84935083013590506155818161553a565b809150509250929050565b5f806020838503121561559d575f80fd5b82356001600160401b03808211156155b3575f80fd5b818501915085601f8301126155c6575f80fd5b8135818111156155d4575f80fd5b8660208285010111156155e5575f80fd5b60209290920196919550909350505050565b600181811c9082168061560b57607f821691505b60208210810361562957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf38284615459565b602081525f611ea1602083018461548f565b5f6020828403121561565f575f80fd5b5051919050565b5f60208284031215615676575f80fd5b8135611ea18161553a565b5f808335601e19843603018112615696575f80fd5b8301803591506001600160401b038211156156af575f80fd5b6020019150600581901b360382131561384a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156ee575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561572e5761572e6156f8565b60405290565b604080519081016001600160401b038111828210171561572e5761572e6156f8565b604051601f8201601f191681016001600160401b038111828210171561577e5761577e6156f8565b604052919050565b5f6001600160401b0382111561579e5761579e6156f8565b50601f01601f191660200190565b5f82601f8301126157bb575f80fd5b81356157ce6157c982615786565b615756565b8181528460208386010111156157e2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561580e575f80fd5b61581661570c565b82356001600160401b038082111561582c575f80fd5b615838368387016157ac565b8352602085013591508082111561584d575f80fd5b5061585a368286016157ac565b60208301525061586c60408401615369565b604082015292915050565b5f82516156ee81846020870161546d565b601f8211156104e357805f5260205f20601f840160051c810160208510156158ad5750805b601f840160051c820191505b81811015611715575f81556001016158b9565b81516001600160401b038111156158e5576158e56156f8565b6158f9816158f384546155f7565b84615888565b602080601f83116001811461592c575f84156159155750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b8281101561595a5788860151825594840194600190910190840161593b565b508582101561597757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615987565b5f63ffffffff8083168181036159c6576159c6615987565b6001019392505050565b8082028115828204841417610cf357610cf3615987565b5f82615a0157634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a1a57615a1a615445565b91905290565b5f60208083525f8454615a32816155f7565b806020870152604060018084165f8114615a535760018114615a6f57615a9c565b60ff19851660408a0152604084151560051b8a01019550615a9c565b895f5260205f205f5b85811015615a935781548b8201860152908301908801615a78565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561200657612006615987565b6001600160401b0382811682821603908082111561200657612006615987565b805161527981615259565b5f8060408385031215615b15575f80fd5b82516001600160401b0380821115615b2b575f80fd5b9084019060608287031215615b3e575f80fd5b615b4661570c565b82518152602080840151615b598161553a565b82820152604084015183811115615b6e575f80fd5b80850194505087601f850112615b82575f80fd5b83519250615b926157c984615786565b8381528882858701011115615ba5575f80fd5b615bb48483830184880161546d565b80604084015250819550615bc9818801615af9565b9450505050509250929050565b81810381811115610cf357610cf3615987565b5f808335601e19843603018112615bfe575f80fd5b8301803591506001600160401b03821115615c17575f80fd5b60200191503681900382131561384a575f80fd5b5f8851615c3c818460208d0161546d565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615cb757615cb7615987565b505092915050565b5f8235603e198336030181126156ee575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d11575f80fd5b615d19615734565b615d2283615266565b81526020808401356001600160401b0380821115615d3e575f80fd5b9085019036601f830112615d50575f80fd5b813581811115615d6257615d626156f8565b8060051b9150615d73848301615756565b8181529183018401918481019036841115615d8c575f80fd5b938501935b83851015615db65784359250615da68361553a565b8282529385019390850190615d91565b94860194909452509295945050505050565b5f60208284031215615dd8575f80fd5b611ea182615358565b5f60208284031215615df1575f80fd5b813560ff81168114611ea1575f80fd5b5f6001600160401b038083168181036159c6576159c6615987565b5f60208284031215615e2c575f80fd5b8151611ea181615259565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e7d81602a850160208b0161546d565b865190830190615e9481602a840160208b0161546d565b60c087901b6001600160c01b031916602a9290910191820152615ec6603282018660e01b6001600160e01b0319169052565b615edf603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f0281846020880161546d565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f3881846020890161546d565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f7381846020880161546d565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index d6fa194a5..a78ba17b0 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f09380380615f0983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615dbc8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004615073565b610615565b005b348015610221575f80fd5b506102146102303660046150ae565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004615073565b610858565b34801561028a575f80fd5b506102146102993660046150c5565b610863565b3480156102a9575f80fd5b506102146102b8366004615113565b610d8d565b3480156102c8575f80fd5b506102dc6102d73660046150ae565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004615073565b610e5b565b348015610378575f80fd5b50610214610387366004615134565b610e66565b348015610397575f80fd5b506102146103a636600461514d565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee36600461518b565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b3660046150ae565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004615073565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b506102146104803660046150ae565b611208565b348015610490575f80fd5b5061021461049f36600461514d565b6112d3565b3480156104af575f80fd5b506102146104be366004615134565b6114fc565b6103f36104d13660046151b5565b611685565b3480156104e1575f80fd5b506103f35f80516020615d1083398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a3660046150ae565b6116b9565b34801561053a575f80fd5b506103f35f80516020615d3083398151915281565b34801561055a575f80fd5b506102146105693660046150ae565b6118a2565b348015610579575f80fd5b50610214610588366004615209565b6119df565b6103f361059b3660046150ae565b611abc565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce3660046150ae565b611aed565b6040516102579190615295565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f3610610366004615315565b611c3c565b610620838383611c97565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d908339815191526020526040808220815160e0810190925280545f80516020615d3083398151915293929190829060ff16600581111561069757610697615220565b60058111156106a8576106a8615220565b81526020016001820180546106bc90615380565b80601f01602080910402602001604051908101604052809291908181526020018280546106e890615380565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e615220565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016153b2565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f612056565b6040518263ffffffff1660e01b815260040161081291906153c0565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906153d2565b50505050565b610852838383611c97565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615d308339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c91906153d2565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016153fd565b6001600160a01b0316146109995761097460608401604085016153fd565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a76060850185615418565b905090505f805b828163ffffffff161015610c8f575f6109ca6060880188615418565b8363ffffffff168181106109e0576109e061545d565b90506020028101906109f29190615471565b6109fb90615595565b80516040519192505f916008880191610a139161560e565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c91906004016153c0565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c9161560e565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca91906153d2565b90508086600801835f0151604051610ae2919061560e565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b64615220565b021790555060208201516001820190610b7d9082615663565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c22911685615732565b8251604051919550610c339161560e565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c8890615745565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615767565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce2866120a5565b604001516121bb565b90505f610cf787612348565b90505f600282604051610d0a919061560e565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d4891906153d2565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612522565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611aed565b5190506002816005811115610dd757610dd7615220565b14610df7578060405163170cc93360e21b815260040161063c91906153b2565b610852838361255d565b5f805f80516020615d1083398151915260030154610e1f908461577e565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b6108528383836127d7565b610e6e6129c3565b5f80516020615d108339815191525f80610e87846129fa565b91509150610e9482612522565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece615220565b03610ef3575f83815260088501602052604081208054919055610ef18282612d38565b505b610f0981610f048460400151611192565b612d96565b505050505b610f2460015f80516020615d7083398151915255565b50565b5f8181525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d1083398151915293929190829060ff166003811115610f7457610f74615220565b6003811115610f8557610f85615220565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611aed565b905060018351600381111561101257611012615220565b14611033578251604051633b0d540d60e21b815261063c919060040161579d565b60048151600581111561104857611048615220565b0361105e5761105685612dbc565b505050505050565b5f8061107561106c896120a5565b60400151612fa3565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b038416615767565b5f6111d382611aed565b6080015192915050565b6111e88383836127d7565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615d108339815191525f61122083611aed565b519050600481600581111561123757611237615220565b14611257578060405163170cc93360e21b815260040161063c91906153b2565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612d38565b6112db6129c3565b5f8181525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d1083398151915293929190829060ff16600381111561132857611328615220565b600381111561133957611339615220565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b2615220565b146113d3578051604051633b0d540d60e21b815261063c919060040161579d565b600282015460808201516113f0916001600160401b0316906157b7565b6001600160401b03164210156114245760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b60046114338260400151611aed565b51600581111561144557611445615220565b146114d7575f611454856120a5565b90505f806114658360400151612fa3565b5091509150818460400151146114915760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b031611156114d357604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b6114e083612dbc565b50506114f860015f80516020615d7083398151915255565b5050565b5f80516020615d308339815191525f80611521611518856120a5565b604001516131f9565b915091508061154757604051632d07135360e01b8152811515600482015260240161063c565b5f8281526006840160205260409020805461156190615380565b90505f036115855760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff1660058111156115ab576115ab615220565b146115de575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016153b2565b5f82815260068401602052604081206115f691614fc7565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61168e6129c3565b61169a848484346133b5565b90506116b260015f80516020615d7083398151915255565b9392505050565b5f8181525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d1083398151915293929190829060ff16600381111561170657611706615220565b600381111561171757611717615220565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561179057611790615220565b141580156117b157506003815160038111156117ae576117ae615220565b14155b156117d2578051604051633b0d540d60e21b815261063c919060040161579d565b5f6117e08260400151611aed565b905080606001516001600160401b03165f03611812576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb61183f846040015184606001518560800151612056565b6040518263ffffffff1660e01b815260040161185b91906153c0565b6020604051808303815f875af1158015611877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061189b91906153d2565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615d3083398151915291906118e990615380565b90505f0361190d5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff16600581111561193357611933615220565b14611966575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016153b2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161199f91906004016157d7565b6020604051808303815f875af11580156119bb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064591906153d2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a28575080546001600160401b03808416911610155b15611a465760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a7083613583565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611ac56129c3565b611ad0823334613594565b9050611ae860015f80516020615d7083398151915255565b919050565b611af5614ffe565b5f8281525f80516020615d90833981519152602052604090819020815160e0810190925280545f80516020615d30833981519152929190829060ff166005811115611b4257611b42615220565b6005811115611b5357611b53615220565b8152602001600182018054611b6790615380565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9390615380565b8015611bde5780601f10611bb557610100808354040283529160200191611bde565b820191905f5260205f20905b815481529060010190602001808311611bc157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615d30833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c7f9086908690615861565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d108339815191529284929091829060ff166003811115611ce557611ce5615220565b6003811115611cf657611cf6615220565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d6c82611aed565b9050600283516003811115611d8357611d83615220565b14611da4578251604051633b0d540d60e21b815261063c919060040161579d565b60208301516001600160a01b03163314611e40575f8281526005850160205260409020546001600160a01b03163314611ddd5733611278565b5f82815260058501602052604090205460a0820151611e0c91600160b01b90046001600160401b0316906157b7565b6001600160401b0316421015611e405760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e5557611e55615220565b03611f835760028401546080840151611e77916001600160401b0316906157b7565b6001600160401b0316421015611eab5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611ebd57611ebb828761255d565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ef6918491611ef19190615870565b613869565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611f37846139c0565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116b29350505050565b600481516005811115611f9857611f98615220565b0361203a577fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03168360800151611fd791906157b7565b6001600160401b031642101561200b5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b612014836139c0565b5f89815260078601602052604090205561202d88612dbc565b60019450505050506116b2565b805160405163170cc93360e21b815261063c91906004016153b2565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612109573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612130919081019061589b565b915091508061215257604051636b2f19e960e01b815260040160405180910390fd5b815115612178578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156121b4576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f81516026146121f057815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b600281101561223f5761220781600161596d565b612212906008615767565b61ffff168482815181106122285761222861545d565b016020015160f81c901b91909117906001016121f3565b5061ffff8116156122695760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156122c45761228081600361596d565b61228b906008615767565b63ffffffff168561229d836002615732565b815181106122ad576122ad61545d565b016020015160f81c901b919091179060010161226c565b5063ffffffff8116156122ea57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561233f5761230181601f61596d565b61230c906008615767565b86612318836006615732565b815181106123285761232861545d565b016020015160f81c901b91909117906001016122ed565b50949350505050565b60605f80833560208501356014612364878701604089016153fd565b6123716060890189615418565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123f76060850185615418565b90508110156121b4578161240e6060860186615418565b8381811061241e5761241e61545d565b90506020028101906124309190615471565b61243a9080615980565b90506124496060870187615418565b848181106124595761245961545d565b905060200281019061246b9190615471565b6124759080615980565b6124826060890189615418565b868181106124925761249261545d565b90506020028101906124a49190615471565b6124b2906020810190615980565b6124bf60608b018b615418565b888181106124cf576124cf61545d565b90506020028101906124e19190615471565b6124f290606081019060400161518b565b60405160200161250897969594939291906159c2565b60408051601f1981840301815291905291506001016123ea565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125a8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125cf919081019061589b565b91509150806125f157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061265891906153d2565b82511461267e578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156126ba576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806126c98460400151613b5d565b915091508187146126f05760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615d10833981519152906001600160401b0390811690831611156127ad575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26127cc565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615d10833981519152816127f086613d4e565b90506127fb86612522565b61280a576001925050506116b2565b5f8681526005830160205260409020546001600160a01b0316331461282f5733611278565b5f86815260058301602052604090205460a082015161285e91600160b01b90046001600160401b0316906157b7565b6001600160401b03168160c001516001600160401b031610156128a55760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156128bd576128b6878661255d565b90506128db565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061290090611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612969573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061298d91906153d2565b905080846008015f8a81526020019081526020015f205f8282546129b19190615732565b90915550501515979650505050505050565b5f80516020615d708339815191528054600119016129f457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612a03614ffe565b5f80516020615d308339815191525f80612a1f611518876120a5565b915091508015612a4657604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612a7757612a77615220565b6005811115612a8857612a88615220565b8152602001600182018054612a9c90615380565b80601f0160208091040260200160405190810160405280929190818152602001828054612ac890615380565b8015612b135780601f10612aea57610100808354040283529160200191612b13565b820191905f5260205f20905b815481529060010190602001808311612af657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612b7e57612b7e615220565b14158015612b9f5750600181516005811115612b9c57612b9c615220565b14155b15612bc057805160405163170cc93360e21b815261063c91906004016153b2565b600381516005811115612bd557612bd5615220565b03612be35760048152612be8565b600581525b836008018160200151604051612bfe919061560e565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612c4257612c42615220565b021790555060208201516001820190612c5b9082615663565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612d0157612d01615220565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612d84575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114f86001600160a01b03831682614032565b60015f80516020615d7083398151915255565b5f8181525f80516020615d508339815191526020526040808220815160e0810190925280545f80516020615d1083398151915293929190829060ff166003811115612e0957612e09615220565b6003811115612e1a57612e1a615220565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612f48575f84815260058701602052604090205461271090612efa90600160a01b900461ffff1685615767565b612f04919061577e565b915081866008015f8681526020019081526020015f205f828254612f289190615732565b90915550612f389050828461596d565b9050612f48856020015182612d38565b612f5d8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612fda57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b600281101561302957612ff181600161596d565b612ffc906008615767565b61ffff168682815181106130125761301261545d565b016020015160f81c901b9190911790600101612fdd565b5061ffff8116156130535760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156130ae5761306a81600361596d565b613075906008615767565b63ffffffff1687613087836002615732565b815181106130975761309761545d565b016020015160f81c901b9190911790600101613056565b5063ffffffff81166003146130d657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561312b576130ed81601f61596d565b6130f8906008615767565b88613104836006615732565b815181106131145761311461545d565b016020015160f81c901b91909117906001016130d9565b505f805b600881101561318a5761314381600761596d565b61314e906008615767565b6001600160401b031689613163836026615732565b815181106131735761317361545d565b016020015160f81c901b919091179060010161312f565b505f805b60088110156131e9576131a281600761596d565b6131ad906008615767565b6001600160401b03168a6131c283602e615732565b815181106131d2576131d261545d565b016020015160f81c901b919091179060010161318e565b5091989097509095509350505050565b5f80825160271461322f57825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561327e5761324681600161596d565b613251906008615767565b61ffff168582815181106132675761326761545d565b016020015160f81c901b9190911790600101613232565b5061ffff8116156132a85760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613303576132bf81600361596d565b6132ca906008615767565b63ffffffff16866132dc836002615732565b815181106132ec576132ec61545d565b016020015160f81c901b91909117906001016132ab565b5063ffffffff811660021461332b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156133805761334281601f61596d565b61334d906008615767565b87613359836006615732565b815181106133695761336961545d565b016020015160f81c901b919091179060010161332e565b505f866026815181106133955761339561545d565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615d1083398151915290600160401b900461ffff9081169086161080613409575061271061ffff8616115b1561342d57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613469576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b805483108061347b5750806001015483115b1561349c5760405163222d164360e21b81526004810184905260240161063c565b825f6134a782610e01565b90505f6134b489836140c5565b905060405180608001604052806134c83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61358b61463d565b610f2481614688565b5f5f80516020615d10833981519152816135ad84610e01565b90505f6135b987611aed565b90506135c487612522565b6135e4576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156135f9576135f9615220565b1461361a57805160405163170cc93360e21b815261063c91906004016153b2565b5f82826080015161362b91906157b7565b905083600201600a9054906101000a90046001600160401b031682604001516136549190615a2b565b6001600160401b0316816001600160401b0316111561369157604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061369d8a84613869565b915091505f8a836040516020016136cb92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561375e5761375e615220565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d90833981519152602052604081206002015481905f80516020615d3083398151915290600160801b90046001600160401b03166138b185826146fc565b5f6138bb8761491f565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61390b8a858b612056565b6040518263ffffffff1660e01b815260040161392791906153c0565b6020604051808303815f875af1158015613943573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061396791906153d2565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615d1083398151915290505f6139e08460400151611aed565b90505f6003825160058111156139f8576139f8615220565b1480613a165750600482516005811115613a1457613a14615220565b145b15613a26575060c0810151613a63565b600282516005811115613a3b57613a3b615220565b03613a47575042613a63565b815160405163170cc93360e21b815261063c91906004016153b2565b84608001516001600160401b0316816001600160401b031611613a8a57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613aaf90611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613b30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b5491906153d2565b95945050505050565b5f808251602e14613b9357825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613be257613baa81600161596d565b613bb5906008615767565b61ffff16858281518110613bcb57613bcb61545d565b016020015160f81c901b9190911790600101613b96565b5061ffff811615613c0c5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613c6757613c2381600361596d565b613c2e906008615767565b63ffffffff1686613c40836002615732565b81518110613c5057613c5061545d565b016020015160f81c901b9190911790600101613c0f565b5063ffffffff811615613c8d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613ce257613ca481601f61596d565b613caf906008615767565b87613cbb836006615732565b81518110613ccb57613ccb61545d565b016020015160f81c901b9190911790600101613c90565b505f805b6008811015613d4157613cfa81600761596d565b613d05906008615767565b6001600160401b031688613d1a836026615732565b81518110613d2a57613d2a61545d565b016020015160f81c901b9190911790600101613ce6565b5090969095509350505050565b613d56614ffe565b5f8281525f80516020615d908339815191526020526040808220815160e0810190925280545f80516020615d3083398151915293929190829060ff166005811115613da357613da3615220565b6005811115613db457613db4615220565b8152602001600182018054613dc890615380565b80601f0160208091040260200160405190810160405280929190818152602001828054613df490615380565b8015613e3f5780601f10613e1657610100808354040283529160200191613e3f565b820191905f5260205f20905b815481529060010190602001808311613e2257829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613ead57613ead615220565b14613ee0575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016153b2565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613f2457613f24615220565b021790555060208201516001820190613f3d9082615663565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613fdb8582613869565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156140555760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461409e576040519150601f19603f3d011682016040523d82523d5f602084013e6140a3565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661410957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615d3083398151915242614128606086016040870161518b565b6001600160401b031611158061416257506141466202a30042615732565b614156606086016040870161518b565b6001600160401b031610155b1561419c57614177606085016040860161518b565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6141b16141ac6060860186615a56565b614994565b6141c16141ac6080860186615a56565b60306141d06020860186615980565b905014614202576141e46020850185615980565b6040516326475b2f60e11b815261063c925060040190815260200190565b61420c8480615980565b90505f036142395761421e8480615980565b604051633e08a12560e11b815260040161063c929190615a6a565b5f600882016142488680615980565b604051614256929190615861565b9081526020016040518091039020541461428f576142748480615980565b60405163a41f772f60e01b815260040161063c929190615a6a565b614299835f6146fc565b6040805160e08101909152815481525f9081906143a590602081016142be8980615980565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614306908a018a615980565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161434f60608a0160408b0161518b565b6001600160401b0316815260200161436a60608a018a615a56565b61437390615a98565b815260200161438560808a018a615a56565b61438e90615a98565b8152602001876001600160401b0316815250614afd565b5f828152600686016020526040902091935091506143c38282615663565b5081600884016143d38880615980565b6040516143e1929190615861565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061441d9085906004016153c0565b6020604051808303815f875af1158015614439573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061445d91906153d2565b6040805160e08101909152909150806001815260200161447d8980615980565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561450c5761450c615220565b0217905550602082015160018201906145259082615663565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806145c38880615980565b6040516145d1929190615861565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061460f919061518b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661468657604051631afcd79f60e31b815260040160405180910390fd5b565b61469061463d565b61469981614cea565b6146a1614d03565b610f24606082013560808301356146be60c0850160a0860161518b565b6146ce60e0860160c08701615b5f565b6146df610100870160e08801615b78565b6101008701356146f761014089016101208a016153fd565b614d13565b5f80516020615d308339815191525f6001600160401b038084169085161115614730576147298385615870565b905061473d565b61473a8484615870565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061479f57506001840154815161479b916001600160401b031690615732565b8210155b156147c5576001600160401b0383166060820152818152604081015160208201526147e4565b82816060018181516147d791906157b7565b6001600160401b03169052505b60608101516147f4906064615a2b565b602082015160018601546001600160401b03929092169161481f9190600160401b900460ff16615767565b101561484f57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161486a9190615732565b9052506040810180516001600160401b038716919061488a90839061596d565b905250600184015460408201516064916148af91600160401b90910460ff1690615767565b10156148d6578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d908339815191526020526040812060020180545f80516020615d30833981519152919060089061496990600160401b90046001600160401b0316615b98565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6149a16020820182615134565b63ffffffff161580156149c157506149bc6020820182615418565b151590505b15614a08576149d36020820182615134565b6149e06020830183615418565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b614a156020820182615418565b9050614a246020830183615134565b63ffffffff161115614a3d576149d36020820182615134565b60015b614a4d6020830183615418565b90508110156114f857614a636020830183615418565b614a6e60018461596d565b818110614a7d57614a7d61545d565b9050602002016020810190614a9291906153fd565b6001600160a01b0316614aa86020840184615418565b83818110614ab857614ab861545d565b9050602002016020810190614acd91906153fd565b6001600160a01b03161015614af557604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a40565b5f6060826040015151603014614b265760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b67988a986001989297929690959094909390929101615bb3565b60405160208183030381529060405290505f5b84608001516020015151811015614bd957818560800151602001518281518110614ba657614ba661545d565b6020026020010151604051602001614bbf929190615c6d565b60408051601f198184030181529190529150600101614b7a565b5060a0840151805160209182015151604051614bf9938593929101615ca3565b60405160208183030381529060405290505f5b8460a001516020015151811015614c6b57818560a00151602001518281518110614c3857614c3861545d565b6020026020010151604051602001614c51929190615c6d565b60408051601f198184030181529190529150600101614c0c565b5060c0840151604051614c82918391602001615cde565b6040516020818303038152906040529050600281604051614ca3919061560e565b602060405180830381855afa158015614cbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ce191906153d2565b94909350915050565b614cf261463d565b614cfa614ecf565b610f2481614ed7565b614d0b61463d565b614686614fbf565b614d1b61463d565b5f80516020615d1083398151915261ffff85161580614d3f575061271061ffff8616115b15614d6357604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614d875760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614d9a5750600a60ff8516115b15614dbd5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614e24576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614e445760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b61468661463d565b614edf61463d565b80355f80516020615d308339815191529081556014614f046060840160408501615b78565b60ff161180614f235750614f1e6060830160408401615b78565b60ff16155b15614f5757614f386060830160408401615b78565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614f676060830160408401615b78565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f98604083016020840161518b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612da961463d565b508054614fd390615380565b5f825580601f10614fe2575050565b601f0160209004905f5260205f2090810190610f24919061503b565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b8082111561504f575f815560010161503c565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611ae8575f80fd5b5f805f60608486031215615085575f80fd5b83359250602084013561509781615053565b91506150a560408501615060565b90509250925092565b5f602082840312156150be575f80fd5b5035919050565b5f80604083850312156150d6575f80fd5b82356001600160401b038111156150eb575f80fd5b8301608081860312156150fc575f80fd5b915061510a60208401615060565b90509250929050565b5f8060408385031215615124575f80fd5b8235915061510a60208401615060565b5f60208284031215615144575f80fd5b6116b282615060565b5f806040838503121561515e575f80fd5b61516783615060565b946020939093013593505050565b80356001600160401b0381168114611ae8575f80fd5b5f6020828403121561519b575f80fd5b6116b282615175565b803561ffff81168114611ae8575f80fd5b5f805f606084860312156151c7575f80fd5b83356001600160401b038111156151dc575f80fd5b840160a081870312156151ed575f80fd5b92506151fb602085016151a4565b91506150a560408501615175565b5f610140828403121561521a575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061524457615244615220565b9052565b5f5b8381101561526257818101518382015260200161524a565b50505f910152565b5f8151808452615281816020860160208601615248565b601f01601f19169290920160200192915050565b602081526152a7602082018351615234565b5f602083015160e060408401526152c261010084018261526a565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615326575f80fd5b82356001600160401b038082111561533c575f80fd5b818501915085601f83011261534f575f80fd5b81358181111561535d575f80fd5b86602082850101111561536e575f80fd5b60209290920196919550909350505050565b600181811c9082168061539457607f821691505b60208210810361521a57634e487b7160e01b5f52602260045260245ffd5b60208101610e558284615234565b602081525f6116b2602083018461526a565b5f602082840312156153e2575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f6020828403121561540d575f80fd5b81356116b2816153e9565b5f808335601e1984360301811261542d575f80fd5b8301803591506001600160401b03821115615446575f80fd5b6020019150600581901b36038213156139b9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615485575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154c5576154c561548f565b60405290565b604080519081016001600160401b03811182821017156154c5576154c561548f565b604051601f8201601f191681016001600160401b03811182821017156155155761551561548f565b604052919050565b5f6001600160401b038211156155355761553561548f565b50601f01601f191660200190565b5f82601f830112615552575f80fd5b81356155656155608261551d565b6154ed565b818152846020838601011115615579575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155a5575f80fd5b6155ad6154a3565b82356001600160401b03808211156155c3575f80fd5b6155cf36838701615543565b835260208501359150808211156155e4575f80fd5b506155f136828601615543565b60208301525061560360408401615175565b604082015292915050565b5f8251615485818460208701615248565b601f82111561064557805f5260205f20601f840160051c810160208510156156445750805b601f840160051c820191505b8181101561189b575f8155600101615650565b81516001600160401b0381111561567c5761567c61548f565b6156908161568a8454615380565b8461561f565b602080601f8311600181146156c3575f84156156ac5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b828110156156f1578886015182559484019460019091019084016156d2565b508582101561570e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e5561571e565b5f63ffffffff80831681810361575d5761575d61571e565b6001019392505050565b8082028115828204841417610e5557610e5561571e565b5f8261579857634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157b1576157b1615220565b91905290565b6001600160401b038181168382160190808211156121b4576121b461571e565b5f60208083525f84546157e981615380565b806020870152604060018084165f811461580a576001811461582657615853565b60ff19851660408a0152604084151560051b8a01019550615853565b895f5260205f205f5b8581101561584a5781548b820186015290830190880161582f565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038281168282160390808211156121b4576121b461571e565b8051611ae881615053565b5f80604083850312156158ac575f80fd5b82516001600160401b03808211156158c2575f80fd5b90840190606082870312156158d5575f80fd5b6158dd6154a3565b825181526020808401516158f0816153e9565b82820152604084015183811115615905575f80fd5b80850194505087601f850112615919575f80fd5b835192506159296155608461551d565b838152888285870101111561593c575f80fd5b61594b84838301848801615248565b80604084015250819550615960818801615890565b9450505050509250929050565b81810381811115610e5557610e5561571e565b5f808335601e19843603018112615995575f80fd5b8301803591506001600160401b038211156159ae575f80fd5b6020019150368190038213156139b9575f80fd5b5f88516159d3818460208d01615248565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615a4e57615a4e61571e565b505092915050565b5f8235603e19833603018112615485575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615aa8575f80fd5b615ab06154cb565b615ab983615060565b81526020808401356001600160401b0380821115615ad5575f80fd5b9085019036601f830112615ae7575f80fd5b813581811115615af957615af961548f565b8060051b9150615b0a8483016154ed565b8181529183018401918481019036841115615b23575f80fd5b938501935b83851015615b4d5784359250615b3d836153e9565b8282529385019390850190615b28565b94860194909452509295945050505050565b5f60208284031215615b6f575f80fd5b6116b2826151a4565b5f60208284031215615b88575f80fd5b813560ff811681146116b2575f80fd5b5f6001600160401b0380831681810361575d5761575d61571e565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615bf981602a850160208b01615248565b865190830190615c1081602a840160208b01615248565b60c087901b6001600160c01b031916602a9290910191820152615c42603282018660e01b6001600160e01b0319169052565b615c5b603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c7e818460208801615248565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615cb4818460208901615248565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615cef818460208801615248565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615eb8380380615eb883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d6b8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004615022565b610615565b005b348015610221575f80fd5b5061021461023036600461505d565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004615022565b610858565b34801561028a575f80fd5b50610214610299366004615074565b610863565b3480156102a9575f80fd5b506102146102b83660046150c2565b610d8d565b3480156102c8575f80fd5b506102dc6102d736600461505d565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004615022565b610e5b565b348015610378575f80fd5b506102146103873660046150e3565b610e66565b348015610397575f80fd5b506102146103a63660046150fc565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee36600461513a565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b36600461505d565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004615022565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b5061021461048036600461505d565b611208565b348015610490575f80fd5b5061021461049f3660046150fc565b6112d3565b3480156104af575f80fd5b506102146104be3660046150e3565b6114ab565b6103f36104d1366004615164565b611634565b3480156104e1575f80fd5b506103f35f80516020615cbf83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a36600461505d565b611668565b34801561053a575f80fd5b506103f35f80516020615cdf83398151915281565b34801561055a575f80fd5b5061021461056936600461505d565b611851565b348015610579575f80fd5b506102146105883660046151b8565b61198e565b6103f361059b36600461505d565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce36600461505d565b611a9c565b6040516102579190615244565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f36106103660046152c4565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d3f8339815191526020526040808220815160e0810190925280545f80516020615cdf83398151915293929190829060ff166005811115610697576106976151cf565b60058111156106a8576106a86151cf565b81526020016001820180546106bc9061532f565b80601f01602080910402602001604051908101604052809291908181526020018280546106e89061532f565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6151cf565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615361565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f612005565b6040518263ffffffff1660e01b8152600401610812919061536f565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615381565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615cdf8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615381565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016153ac565b6001600160a01b0316146109995761097460608401604085016153ac565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856153c7565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886153c7565b8363ffffffff168181106109e0576109e061540c565b90506020028101906109f29190615420565b6109fb90615544565b80516040519192505f916008880191610a13916155bd565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161536f565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c916155bd565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615381565b90508086600801835f0151604051610ae291906155bd565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646151cf565b021790555060208201516001820190610b7d9082615612565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c229116856156e1565b8251604051919550610c33916155bd565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c88906156f4565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615716565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286612054565b6040015161216a565b90505f610cf7876122f7565b90505f600282604051610d0a91906155bd565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615381565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d96826124d1565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd76151cf565b14610df7578060405163170cc93360e21b815260040161063c9190615361565b610852838361250c565b5f805f80516020615cbf83398151915260030154610e1f908461572d565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612786565b610e6e612972565b5f80516020615cbf8339815191525f80610e87846129a9565b91509150610e94826124d1565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece6151cf565b03610ef3575f83815260088501602052604081208054919055610ef18282612ce7565b505b610f0981610f048460400151611192565b612d45565b505050505b610f2460015f80516020615d1f83398151915255565b50565b5f8181525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf83398151915293929190829060ff166003811115610f7457610f746151cf565b6003811115610f8557610f856151cf565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b9050600183516003811115611012576110126151cf565b14611033578251604051633b0d540d60e21b815261063c919060040161574c565b600481516005811115611048576110486151cf565b0361105e5761105685612d6b565b505050505050565b5f8061107561106c89612054565b60400151612f52565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b038416615716565b5f6111d382611a9c565b6080015192915050565b6111e8838383612786565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615cbf8339815191525f61122083611a9c565b5190506004816005811115611237576112376151cf565b14611257578060405163170cc93360e21b815260040161063c9190615361565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612ce7565b6112db612972565b5f8181525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf83398151915293929190829060ff166003811115611328576113286151cf565b6003811115611339576113396151cf565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b26151cf565b146113d3578051604051633b0d540d60e21b815261063c919060040161574c565b60046113e28260400151611a9c565b5160058111156113f4576113f46151cf565b14611486575f61140385612054565b90505f806114148360400151612f52565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612d6b565b50506114a760015f80516020615d1f83398151915255565b5050565b5f80516020615cdf8339815191525f806114d06114c785612054565b604001516131a8565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546115109061532f565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a6151cf565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615361565b5f82815260068401602052604081206115a591614f76565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d612972565b61164984848434613364565b905061166160015f80516020615d1f83398151915255565b9392505050565b5f8181525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf83398151915293929190829060ff1660038111156116b5576116b56151cf565b60038111156116c6576116c66151cf565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f6151cf565b14158015611760575060038151600381111561175d5761175d6151cf565b14155b15611781578051604051633b0d540d60e21b815261063c919060040161574c565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151612005565b6040518263ffffffff1660e01b815260040161180a919061536f565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615381565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615cdf83398151915291906118989061532f565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e26151cf565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615361565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e9190600401615766565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615381565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f83613532565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a74612972565b611a7f823334613543565b9050611a9760015f80516020615d1f83398151915255565b919050565b611aa4614fad565b5f8281525f80516020615d3f833981519152602052604090819020815160e0810190925280545f80516020615cdf833981519152929190829060ff166005811115611af157611af16151cf565b6005811115611b0257611b026151cf565b8152602001600182018054611b169061532f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b429061532f565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615cdf833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e90869086906157f0565b90815260200160405180910390205491505092915050565b5f8381525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf8339815191529284929091829060ff166003811115611c9457611c946151cf565b6003811115611ca557611ca56151cf565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d326151cf565b14611d53578251604051633b0d540d60e21b815261063c919060040161574c565b60208301516001600160a01b03163314611def575f8281526005850160205260409020546001600160a01b03163314611d8c5733611278565b5f82815260058501602052604090205460a0820151611dbb91600160b01b90046001600160401b0316906157ff565b6001600160401b0316421015611def5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0457611e046151cf565b03611f325760028401546080840151611e26916001600160401b0316906157ff565b6001600160401b0316421015611e5a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e6c57611e6a828761250c565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ea5918491611ea0919061581f565b613818565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee68461396f565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611f4757611f476151cf565b03611fe9577fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03168360800151611f8691906157ff565b6001600160401b0316421015611fba5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611fc38361396f565b5f898152600786016020526040902055611fdc88612d6b565b6001945050505050611661565b805160405163170cc93360e21b815261063c9190600401615361565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120df919081019061584a565b915091508061210157604051636b2f19e960e01b815260040160405180910390fd5b815115612127578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612163576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461219f57815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b60028110156121ee576121b681600161591c565b6121c1906008615716565b61ffff168482815181106121d7576121d761540c565b016020015160f81c901b91909117906001016121a2565b5061ffff8116156122185760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156122735761222f81600361591c565b61223a906008615716565b63ffffffff168561224c8360026156e1565b8151811061225c5761225c61540c565b016020015160f81c901b919091179060010161221b565b5063ffffffff81161561229957604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122ee576122b081601f61591c565b6122bb906008615716565b866122c78360066156e1565b815181106122d7576122d761540c565b016020015160f81c901b919091179060010161229c565b50949350505050565b60605f80833560208501356014612313878701604089016153ac565b61232060608901896153c7565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123a660608501856153c7565b905081101561216357816123bd60608601866153c7565b838181106123cd576123cd61540c565b90506020028101906123df9190615420565b6123e9908061592f565b90506123f860608701876153c7565b848181106124085761240861540c565b905060200281019061241a9190615420565b612424908061592f565b61243160608901896153c7565b868181106124415761244161540c565b90506020028101906124539190615420565b61246190602081019061592f565b61246e60608b018b6153c7565b8881811061247e5761247e61540c565b90506020028101906124909190615420565b6124a190606081019060400161513a565b6040516020016124b79796959493929190615971565b60408051601f198184030181529190529150600101612399565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612557573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261257e919081019061584a565b91509150806125a057604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126079190615381565b82511461262d578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612669576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806126788460400151613b0c565b9150915081871461269f5760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615cbf833981519152906001600160401b03908116908316111561275c575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261277b565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615cbf8339815191528161279f86613cfd565b90506127aa866124d1565b6127b957600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127de5733611278565b5f86815260058301602052604090205460a082015161280d91600160b01b90046001600160401b0316906157ff565b6001600160401b03168160c001516001600160401b031610156128545760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f851561286c57612865878661250c565b905061288a565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906128af90611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612918573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061293c9190615381565b905080846008015f8a81526020019081526020015f205f82825461296091906156e1565b90915550501515979650505050505050565b5f80516020615d1f8339815191528054600119016129a357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6129b2614fad565b5f80516020615cdf8339815191525f806129ce6114c787612054565b9150915080156129f557604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612a2657612a266151cf565b6005811115612a3757612a376151cf565b8152602001600182018054612a4b9061532f565b80601f0160208091040260200160405190810160405280929190818152602001828054612a779061532f565b8015612ac25780601f10612a9957610100808354040283529160200191612ac2565b820191905f5260205f20905b815481529060010190602001808311612aa557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612b2d57612b2d6151cf565b14158015612b4e5750600181516005811115612b4b57612b4b6151cf565b14155b15612b6f57805160405163170cc93360e21b815261063c9190600401615361565b600381516005811115612b8457612b846151cf565b03612b925760048152612b97565b600581525b836008018160200151604051612bad91906155bd565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612bf157612bf16151cf565b021790555060208201516001820190612c0a9082615612565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612cb057612cb06151cf565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612d33575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613fe1565b60015f80516020615d1f83398151915255565b5f8181525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf83398151915293929190829060ff166003811115612db857612db86151cf565b6003811115612dc957612dc96151cf565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612ef7575f84815260058701602052604090205461271090612ea990600160a01b900461ffff1685615716565b612eb3919061572d565b915081866008015f8681526020019081526020015f205f828254612ed791906156e1565b90915550612ee79050828461591c565b9050612ef7856020015182612ce7565b612f0c8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f8957835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612fd857612fa081600161591c565b612fab906008615716565b61ffff16868281518110612fc157612fc161540c565b016020015160f81c901b9190911790600101612f8c565b5061ffff8116156130025760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561305d5761301981600361591c565b613024906008615716565b63ffffffff16876130368360026156e1565b815181106130465761304661540c565b016020015160f81c901b9190911790600101613005565b5063ffffffff811660031461308557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130da5761309c81601f61591c565b6130a7906008615716565b886130b38360066156e1565b815181106130c3576130c361540c565b016020015160f81c901b9190911790600101613088565b505f805b6008811015613139576130f281600761591c565b6130fd906008615716565b6001600160401b0316896131128360266156e1565b815181106131225761312261540c565b016020015160f81c901b91909117906001016130de565b505f805b60088110156131985761315181600761591c565b61315c906008615716565b6001600160401b03168a61317183602e6156e1565b815181106131815761318161540c565b016020015160f81c901b919091179060010161313d565b5091989097509095509350505050565b5f8082516027146131de57825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561322d576131f581600161591c565b613200906008615716565b61ffff168582815181106132165761321661540c565b016020015160f81c901b91909117906001016131e1565b5061ffff8116156132575760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156132b25761326e81600361591c565b613279906008615716565b63ffffffff168661328b8360026156e1565b8151811061329b5761329b61540c565b016020015160f81c901b919091179060010161325a565b5063ffffffff81166002146132da57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561332f576132f181601f61591c565b6132fc906008615716565b876133088360066156e1565b815181106133185761331861540c565b016020015160f81c901b91909117906001016132dd565b505f866026815181106133445761334461540c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615cbf83398151915290600160401b900461ffff90811690861610806133b8575061271061ffff8616115b156133dc57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613418576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b805483108061342a5750806001015483115b1561344b5760405163222d164360e21b81526004810184905260240161063c565b825f61345682610e01565b90505f6134638983614074565b905060405180608001604052806134773390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61353a6145ec565b610f2481614637565b5f5f80516020615cbf8339815191528161355c84610e01565b90505f61356887611a9c565b9050613573876124d1565b613593576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156135a8576135a86151cf565b146135c957805160405163170cc93360e21b815261063c9190600401615361565b5f8282608001516135da91906157ff565b905083600201600a9054906101000a90046001600160401b0316826040015161360391906159da565b6001600160401b0316816001600160401b0316111561364057604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061364c8a84613818565b915091505f8a8360405160200161367a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561370d5761370d6151cf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d3f833981519152602052604081206002015481905f80516020615cdf83398151915290600160801b90046001600160401b031661386085826146ab565b5f61386a876148ce565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6138ba8a858b612005565b6040518263ffffffff1660e01b81526004016138d6919061536f565b6020604051808303815f875af11580156138f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139169190615381565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615cbf83398151915290505f61398f8460400151611a9c565b90505f6003825160058111156139a7576139a76151cf565b14806139c557506004825160058111156139c3576139c36151cf565b145b156139d5575060c0810151613a12565b6002825160058111156139ea576139ea6151cf565b036139f6575042613a12565b815160405163170cc93360e21b815261063c9190600401615361565b84608001516001600160401b0316816001600160401b031611613a3957505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613a5e90611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613adf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b039190615381565b95945050505050565b5f808251602e14613b4257825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b9157613b5981600161591c565b613b64906008615716565b61ffff16858281518110613b7a57613b7a61540c565b016020015160f81c901b9190911790600101613b45565b5061ffff811615613bbb5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613c1657613bd281600361591c565b613bdd906008615716565b63ffffffff1686613bef8360026156e1565b81518110613bff57613bff61540c565b016020015160f81c901b9190911790600101613bbe565b5063ffffffff811615613c3c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c9157613c5381601f61591c565b613c5e906008615716565b87613c6a8360066156e1565b81518110613c7a57613c7a61540c565b016020015160f81c901b9190911790600101613c3f565b505f805b6008811015613cf057613ca981600761591c565b613cb4906008615716565b6001600160401b031688613cc98360266156e1565b81518110613cd957613cd961540c565b016020015160f81c901b9190911790600101613c95565b5090969095509350505050565b613d05614fad565b5f8281525f80516020615d3f8339815191526020526040808220815160e0810190925280545f80516020615cdf83398151915293929190829060ff166005811115613d5257613d526151cf565b6005811115613d6357613d636151cf565b8152602001600182018054613d779061532f565b80601f0160208091040260200160405190810160405280929190818152602001828054613da39061532f565b8015613dee5780601f10613dc557610100808354040283529160200191613dee565b820191905f5260205f20905b815481529060010190602001808311613dd157829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613e5c57613e5c6151cf565b14613e8f575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615361565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ed357613ed36151cf565b021790555060208201516001820190613eec9082615612565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f8a8582613818565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156140045760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461404d576040519150601f19603f3d011682016040523d82523d5f602084013e614052565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140b857604051637fab81e560e01b815260040160405180910390fd5b5f80516020615cdf833981519152426140d7606086016040870161513a565b6001600160401b031611158061411157506140f56202a300426156e1565b614105606086016040870161513a565b6001600160401b031610155b1561414b57614126606085016040860161513a565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61416061415b6060860186615a05565b614943565b61417061415b6080860186615a05565b603061417f602086018661592f565b9050146141b157614193602085018561592f565b6040516326475b2f60e11b815261063c925060040190815260200190565b6141bb848061592f565b90505f036141e8576141cd848061592f565b604051633e08a12560e11b815260040161063c929190615a19565b5f600882016141f7868061592f565b6040516142059291906157f0565b9081526020016040518091039020541461423e57614223848061592f565b60405163a41f772f60e01b815260040161063c929190615a19565b614248835f6146ab565b6040805160e08101909152815481525f908190614354906020810161426d898061592f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906142b5908a018a61592f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016142fe60608a0160408b0161513a565b6001600160401b0316815260200161431960608a018a615a05565b61432290615a47565b815260200161433460808a018a615a05565b61433d90615a47565b8152602001876001600160401b0316815250614aac565b5f828152600686016020526040902091935091506143728282615612565b508160088401614382888061592f565b6040516143909291906157f0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143cc90859060040161536f565b6020604051808303815f875af11580156143e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061440c9190615381565b6040805160e08101909152909150806001815260200161442c898061592f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156144bb576144bb6151cf565b0217905550602082015160018201906144d49082615612565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580614572888061592f565b6040516145809291906157f0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145be919061513a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661463557604051631afcd79f60e31b815260040160405180910390fd5b565b61463f6145ec565b61464881614c99565b614650614cb2565b610f246060820135608083013561466d60c0850160a0860161513a565b61467d60e0860160c08701615b0e565b61468e610100870160e08801615b27565b6101008701356146a661014089016101208a016153ac565b614cc2565b5f80516020615cdf8339815191525f6001600160401b0380841690851611156146df576146d8838561581f565b90506146ec565b6146e9848461581f565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061474e57506001840154815161474a916001600160401b0316906156e1565b8210155b15614774576001600160401b038316606082015281815260408101516020820152614793565b828160600181815161478691906157ff565b6001600160401b03169052505b60608101516147a39060646159da565b602082015160018601546001600160401b0392909216916147ce9190600160401b900460ff16615716565b10156147fe57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161481991906156e1565b9052506040810180516001600160401b038716919061483990839061591c565b9052506001840154604082015160649161485e91600160401b90910460ff1690615716565b1015614885578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d3f8339815191526020526040812060020180545f80516020615cdf833981519152919060089061491890600160401b90046001600160401b0316615b47565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61495060208201826150e3565b63ffffffff16158015614970575061496b60208201826153c7565b151590505b156149b75761498260208201826150e3565b61498f60208301836153c7565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149c460208201826153c7565b90506149d360208301836150e3565b63ffffffff1611156149ec5761498260208201826150e3565b60015b6149fc60208301836153c7565b90508110156114a757614a1260208301836153c7565b614a1d60018461591c565b818110614a2c57614a2c61540c565b9050602002016020810190614a4191906153ac565b6001600160a01b0316614a5760208401846153c7565b83818110614a6757614a6761540c565b9050602002016020810190614a7c91906153ac565b6001600160a01b03161015614aa457604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149ef565b5f6060826040015151603014614ad55760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b16988a986001989297929690959094909390929101615b62565b60405160208183030381529060405290505f5b84608001516020015151811015614b8857818560800151602001518281518110614b5557614b5561540c565b6020026020010151604051602001614b6e929190615c1c565b60408051601f198184030181529190529150600101614b29565b5060a0840151805160209182015151604051614ba8938593929101615c52565b60405160208183030381529060405290505f5b8460a001516020015151811015614c1a57818560a00151602001518281518110614be757614be761540c565b6020026020010151604051602001614c00929190615c1c565b60408051601f198184030181529190529150600101614bbb565b5060c0840151604051614c31918391602001615c8d565b6040516020818303038152906040529050600281604051614c5291906155bd565b602060405180830381855afa158015614c6d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c909190615381565b94909350915050565b614ca16145ec565b614ca9614e7e565b610f2481614e86565b614cba6145ec565b614635614f6e565b614cca6145ec565b5f80516020615cbf83398151915261ffff85161580614cee575061271061ffff8616115b15614d1257604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614d365760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614d495750600a60ff8516115b15614d6c5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614dd3576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614df35760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6146356145ec565b614e8e6145ec565b80355f80516020615cdf8339815191529081556014614eb36060840160408501615b27565b60ff161180614ed25750614ecd6060830160408401615b27565b60ff16155b15614f0657614ee76060830160408401615b27565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614f166060830160408401615b27565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f47604083016020840161513a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d586145ec565b508054614f829061532f565b5f825580601f10614f91575050565b601f0160209004905f5260205f2090810190610f249190614fea565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ffe575f8155600101614feb565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215615034575f80fd5b83359250602084013561504681615002565b91506150546040850161500f565b90509250925092565b5f6020828403121561506d575f80fd5b5035919050565b5f8060408385031215615085575f80fd5b82356001600160401b0381111561509a575f80fd5b8301608081860312156150ab575f80fd5b91506150b96020840161500f565b90509250929050565b5f80604083850312156150d3575f80fd5b823591506150b96020840161500f565b5f602082840312156150f3575f80fd5b6116618261500f565b5f806040838503121561510d575f80fd5b6151168361500f565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f6020828403121561514a575f80fd5b61166182615124565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615176575f80fd5b83356001600160401b0381111561518b575f80fd5b840160a0818703121561519c575f80fd5b92506151aa60208501615153565b915061505460408501615124565b5f61014082840312156151c9575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106151f3576151f36151cf565b9052565b5f5b838110156152115781810151838201526020016151f9565b50505f910152565b5f81518084526152308160208601602086016151f7565b601f01601f19169290920160200192915050565b602081526152566020820183516151e3565b5f602083015160e06040840152615271610100840182615219565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156152d5575f80fd5b82356001600160401b03808211156152eb575f80fd5b818501915085601f8301126152fe575f80fd5b81358181111561530c575f80fd5b86602082850101111561531d575f80fd5b60209290920196919550909350505050565b600181811c9082168061534357607f821691505b6020821081036151c957634e487b7160e01b5f52602260045260245ffd5b60208101610e5582846151e3565b602081525f6116616020830184615219565b5f60208284031215615391575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f602082840312156153bc575f80fd5b813561166181615398565b5f808335601e198436030181126153dc575f80fd5b8301803591506001600160401b038211156153f5575f80fd5b6020019150600581901b3603821315613968575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615434575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154745761547461543e565b60405290565b604080519081016001600160401b03811182821017156154745761547461543e565b604051601f8201601f191681016001600160401b03811182821017156154c4576154c461543e565b604052919050565b5f6001600160401b038211156154e4576154e461543e565b50601f01601f191660200190565b5f82601f830112615501575f80fd5b813561551461550f826154cc565b61549c565b818152846020838601011115615528575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615554575f80fd5b61555c615452565b82356001600160401b0380821115615572575f80fd5b61557e368387016154f2565b83526020850135915080821115615593575f80fd5b506155a0368286016154f2565b6020830152506155b260408401615124565b604082015292915050565b5f82516154348184602087016151f7565b601f82111561064557805f5260205f20601f840160051c810160208510156155f35750805b601f840160051c820191505b8181101561184a575f81556001016155ff565b81516001600160401b0381111561562b5761562b61543e565b61563f81615639845461532f565b846155ce565b602080601f831160018114615672575f841561565b5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b828110156156a057888601518255948401946001909101908401615681565b50858210156156bd57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e556156cd565b5f63ffffffff80831681810361570c5761570c6156cd565b6001019392505050565b8082028115828204841417610e5557610e556156cd565b5f8261574757634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615760576157606151cf565b91905290565b5f60208083525f84546157788161532f565b806020870152604060018084165f811461579957600181146157b5576157e2565b60ff19851660408a0152604084151560051b8a010195506157e2565b895f5260205f205f5b858110156157d95781548b82018601529083019088016157be565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115612163576121636156cd565b6001600160401b03828116828216039080821115612163576121636156cd565b8051611a9781615002565b5f806040838503121561585b575f80fd5b82516001600160401b0380821115615871575f80fd5b9084019060608287031215615884575f80fd5b61588c615452565b8251815260208084015161589f81615398565b828201526040840151838111156158b4575f80fd5b80850194505087601f8501126158c8575f80fd5b835192506158d861550f846154cc565b83815288828587010111156158eb575f80fd5b6158fa848383018488016151f7565b8060408401525081955061590f81880161583f565b9450505050509250929050565b81810381811115610e5557610e556156cd565b5f808335601e19843603018112615944575f80fd5b8301803591506001600160401b0382111561595d575f80fd5b602001915036819003821315613968575f80fd5b5f8851615982818460208d016151f7565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146159fd576159fd6156cd565b505092915050565b5f8235603e19833603018112615434575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a57575f80fd5b615a5f61547a565b615a688361500f565b81526020808401356001600160401b0380821115615a84575f80fd5b9085019036601f830112615a96575f80fd5b813581811115615aa857615aa861543e565b8060051b9150615ab984830161549c565b8181529183018401918481019036841115615ad2575f80fd5b938501935b83851015615afc5784359250615aec83615398565b8282529385019390850190615ad7565b94860194909452509295945050505050565b5f60208284031215615b1e575f80fd5b61166182615153565b5f60208284031215615b37575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b0380831681810361570c5761570c6156cd565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615ba881602a850160208b016151f7565b865190830190615bbf81602a840160208b016151f7565b60c087901b6001600160c01b031916602a9290910191820152615bf1603282018660e01b6001600160e01b0319169052565b615c0a603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c2d8184602088016151f7565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c638184602089016151f7565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615c9e8184602088016151f7565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 74e1d499c..ccf657946 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -697,11 +697,6 @@ abstract contract PoSValidatorManager is revert InvalidDelegatorStatus(delegator.status); } - // Check that minimum stake duration has passed. - if (block.timestamp < delegator.startedAt + $._minimumStakeDuration) { - revert MinStakeDurationNotPassed(uint64(block.timestamp)); - } - if (getValidator(delegator.validationID).status != ValidatorStatus.Completed) { // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); From 42af28bb465ddc8ab85d7e5e163e139e183c232b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 24 Oct 2024 12:34:26 -0400 Subject: [PATCH 29/35] Move check --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 12 ++++++------ .../tests/PoSValidatorManagerTests.t.sol | 5 ++++- scripts/local/e2e_test.sh | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 01f03d3b9..11f98bc63 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516161ad3803806161ad83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160608061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f36600461527e565b6104b3565b005b6102146102243660046152b9565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b61021461025636600461527e565b6106f6565b6102146102693660046152d0565b610701565b61021461027c36600461531e565b610c2b565b61029461028f3660046152b9565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d636600461527e565b610cf9565b6102146102e936600461533f565b610d04565b6103016102fc36600461537f565b610dc5565b60405190815260200161023f565b61021461031d3660046153e4565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461540c565b611065565b6102946103603660046152b9565b61109c565b6103015f81565b61021461037a36600461527e565b6110b0565b610231603081565b6102146103953660046152b9565b6110db565b6102146103a83660046153e4565b6111a6565b6103016103bb366004615425565b61137e565b6102146103ce36600461533f565b6113aa565b6103015f80516020615fb483398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b3660046152b9565b611533565b6103015f80516020615fd483398151915281565b6102146104423660046152b9565b61171c565b610231601481565b61046261045d3660046152b9565b611859565b60405161023f91906154ba565b6102946202a30081565b6103015f80516020615f9483398151915281565b61021461049b36600461554e565b6119a8565b6103016104ae36600461558c565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160348339815191526020526040808220815160e0810190925280545f80516020615fd483398151915293929190829060ff16600581111561053557610535615445565b600581111561054657610546615445565b815260200160018201805461055a906155f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906155f7565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615445565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562f565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611ea8565b6040518263ffffffff1660e01b81526004016106b0919061563d565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061564f565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615fd48339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba919061564f565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615666565b6001600160a01b031614610837576108126060840160408501615666565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615681565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615681565b8363ffffffff1681811061087e5761087e6156c6565b905060200281019061089091906156da565b610899906157fe565b80516040519192505f9160088801916108b191615877565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da919060040161563d565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615877565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610968919061564f565b90508086600801835f01516040516109809190615877565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615445565b021790555060208201516001820190610a1b90826158cc565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561599b565b8251604051919550610ad191615877565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906159ae565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836159d0565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611ef7565b6040015161200d565b90505f610b958761219a565b90505f600282604051610ba89190615877565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be6919061564f565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612374565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c75615445565b14610c95578060405163170cc93360e21b81526004016104da919061562f565b6106f083836123af565b5f805f80516020615fb483398151915260030154610cbd90846159e7565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f0838383612629565b610d0c612815565b5f80516020615fb48339815191525f80610d258461284c565b91509150610d3282612374565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c615445565b03610d91575f83815260088501602052604081208054919055610d8f8282612b8a565b505b610da781610da28460400151611065565b612c00565b505050505b610dc260015f8051602061601483398151915255565b50565b5f610dce612815565b610dda85858585612c36565b9050610df260015f8051602061601483398151915255565b949350505050565b5f8181525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb483398151915293929190829060ff166003811115610e4757610e47615445565b6003811115610e5857610e58615445565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee5615445565b14610f06578251604051633b0d540d60e21b81526104da9190600401615a06565b600481516005811115610f1b57610f1b615445565b03610f3157610f2985612e0f565b505050505050565b5f80610f48610f3f89611ef7565b60400151612ff6565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b0384166159d0565b5f6110a682611859565b6080015192915050565b6110bb838383612629565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615fb48339815191525f6110f383611859565b519050600481600581111561110a5761110a615445565b1461112a578060405163170cc93360e21b81526004016104da919061562f565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612b8a565b6111ae612815565b5f8181525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb483398151915293929190829060ff1660038111156111fb576111fb615445565b600381111561120c5761120c615445565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128557611285615445565b146112a6578051604051633b0d540d60e21b81526104da9190600401615a06565b60046112b58260400151611859565b5160058111156112c7576112c7615445565b14611359575f6112d685611ef7565b90505f806112e78360400151612ff6565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612e0f565b505061137a60015f8051602061601483398151915255565b5050565b5f611387612815565b61139283338461324c565b9050610cf360015f8051602061601483398151915255565b5f80516020615fd48339815191525f806113cf6113c685611ef7565b60400151613524565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f906155f7565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff16600581111561145957611459615445565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562f565b5f82815260068401602052604081206114a4916151cd565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb483398151915293929190829060ff16600381111561158057611580615445565b600381111561159157611591615445565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a615445565b1415801561162b575060038151600381111561162857611628615445565b14155b1561164c578051604051633b0d540d60e21b81526104da9190600401615a06565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611ea8565b6040518263ffffffff1660e01b81526004016116d5919061563d565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611715919061564f565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615fd48339815191529190611763906155f7565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad615445565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562f565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118199190600401615a20565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e3919061564f565b611861615204565b5f8281525f80516020616034833981519152602052604090819020815160e0810190925280545f80516020615fd4833981519152929190829060ff1660058111156118ae576118ae615445565b60058111156118bf576118bf615445565b81526020016001820180546118d3906155f7565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff906155f7565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a84846136e0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615fd4833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca9086908690615aaa565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb48339815191529284929091829060ff166003811115611b3057611b30615445565b6003811115611b4157611b41615445565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce615445565b14611bef578251604051633b0d540d60e21b81526104da9190600401615a06565b60208301516001600160a01b03163314611c8b575f8281526005850160205260409020546001600160a01b03163314611c28573361114b565b5f82815260058501602052604090205460a0820151611c5791600160b01b90046001600160401b031690615ab9565b6001600160401b0316421015611c8b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca057611ca0615445565b03611dce5760028401546080840151611cc2916001600160401b031690615ab9565b6001600160401b0316421015611cf65760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d0857611d0682876123af565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d41918491611d3c9190615ad9565b6136fa565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d8284613851565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611ea19350505050565b600481516005811115611de357611de3615445565b03611e85577fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03168360800151611e229190615ab9565b6001600160401b0316421015611e565760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b611e5f83613851565b5f898152600786016020526040902055611e7888612e0f565b6001945050505050611ea1565b805160405163170cc93360e21b81526104da919060040161562f565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f829190810190615b04565b9150915080611fa457604051636b2f19e960e01b815260040160405180910390fd5b815115611fca578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615612006576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f815160261461204257815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561209157612059816001615bd6565b6120649060086159d0565b61ffff1684828151811061207a5761207a6156c6565b016020015160f81c901b9190911790600101612045565b5061ffff8116156120bb5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015612116576120d2816003615bd6565b6120dd9060086159d0565b63ffffffff16856120ef83600261599b565b815181106120ff576120ff6156c6565b016020015160f81c901b91909117906001016120be565b5063ffffffff81161561213c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121915761215381601f615bd6565b61215e9060086159d0565b8661216a83600661599b565b8151811061217a5761217a6156c6565b016020015160f81c901b919091179060010161213f565b50949350505050565b60605f808335602085013560146121b687870160408901615666565b6121c36060890189615681565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6122496060850185615681565b905081101561200657816122606060860186615681565b83818110612270576122706156c6565b905060200281019061228291906156da565b61228c9080615be9565b905061229b6060870187615681565b848181106122ab576122ab6156c6565b90506020028101906122bd91906156da565b6122c79080615be9565b6122d46060890189615681565b868181106122e4576122e46156c6565b90506020028101906122f691906156da565b612304906020810190615be9565b61231160608b018b615681565b88818110612321576123216156c6565b905060200281019061233391906156da565b61234490606081019060400161540c565b60405160200161235a9796959493929190615c2b565b60408051601f19818403018152919052915060010161223c565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156123fa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124219190810190615b04565b915091508061244357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612486573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124aa919061564f565b8251146124d0578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561250c576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061251b84604001516139ee565b915091508187146125425760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615fb4833981519152906001600160401b0390811690831611156125ff575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261261e565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615fb48339815191528161264286613bdf565b905061264d86612374565b61265c57600192505050611ea1565b5f8681526005830160205260409020546001600160a01b03163314612681573361114b565b5f86815260058301602052604090205460a08201516126b091600160b01b90046001600160401b031690615ab9565b6001600160401b03168160c001516001600160401b031610156126f75760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f851561270f5761270887866123af565b905061272d565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061275290611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156127bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127df919061564f565b905080846008015f8a81526020019081526020015f205f828254612803919061599b565b90915550501515979650505050505050565b5f8051602061601483398151915280546001190161284657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612855615204565b5f80516020615fd48339815191525f806128716113c687611ef7565b91509150801561289857604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128c9576128c9615445565b60058111156128da576128da615445565b81526020016001820180546128ee906155f7565b80601f016020809104026020016040519081016040528092919081815260200182805461291a906155f7565b80156129655780601f1061293c57610100808354040283529160200191612965565b820191905f5260205f20905b81548152906001019060200180831161294857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129d0576129d0615445565b141580156129f157506001815160058111156129ee576129ee615445565b14155b15612a1257805160405163170cc93360e21b81526104da919060040161562f565b600381516005811115612a2757612a27615445565b03612a355760048152612a3a565b600581525b836008018160200151604051612a509190615877565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a9457612a94615445565b021790555060208201516001820190612aad90826158cc565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b5357612b53615445565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615f9483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612be5575f80fd5b505af1158015612bf7573d5f803e3d5ffd5b50505050505050565b5f80516020615f948339815191525461137a906001600160a01b03168383613ec3565b60015f8051602061601483398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615fb483398151915290600160401b900461ffff9081169086161080612c8a575061271061ffff8616115b15612cae57604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612cea576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612cfc5750806001015483115b15612d1d5760405163222d164360e21b8152600481018490526024016104da565b5f612d2784613f22565b90505f612d3382610c9f565b90505f612d408983613f45565b90506040518060800160405280612d543390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ff48339815191526020526040808220815160e0810190925280545f80516020615fb483398151915293929190829060ff166003811115612e5c57612e5c615445565b6003811115612e6d57612e6d615445565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612f9b575f84815260058701602052604090205461271090612f4d90600160a01b900461ffff16856159d0565b612f5791906159e7565b915081866008015f8681526020019081526020015f205f828254612f7b919061599b565b90915550612f8b90508284615bd6565b9050612f9b856020015182612b8a565b612fb08560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461302d57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b600281101561307c57613044816001615bd6565b61304f9060086159d0565b61ffff16868281518110613065576130656156c6565b016020015160f81c901b9190911790600101613030565b5061ffff8116156130a65760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613101576130bd816003615bd6565b6130c89060086159d0565b63ffffffff16876130da83600261599b565b815181106130ea576130ea6156c6565b016020015160f81c901b91909117906001016130a9565b5063ffffffff811660031461312957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561317e5761314081601f615bd6565b61314b9060086159d0565b8861315783600661599b565b81518110613167576131676156c6565b016020015160f81c901b919091179060010161312c565b505f805b60088110156131dd57613196816007615bd6565b6131a19060086159d0565b6001600160401b0316896131b683602661599b565b815181106131c6576131c66156c6565b016020015160f81c901b9190911790600101613182565b505f805b600881101561323c576131f5816007615bd6565b6132009060086159d0565b6001600160401b03168a61321583602e61599b565b81518110613225576132256156c6565b016020015160f81c901b91909117906001016131e1565b5091989097509095509350505050565b5f5f80516020615fb48339815191528161326861028f85613f22565b90505f61327487611859565b905061327f87612374565b61329f576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156132b4576132b4615445565b146132d557805160405163170cc93360e21b81526104da919060040161562f565b5f8282608001516132e69190615ab9565b905083600201600a9054906101000a90046001600160401b0316826040015161330f9190615c94565b6001600160401b0316816001600160401b0316111561334c57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806133588a846136fa565b915091505f8a8360405160200161338692919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561341957613419615445565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461355a57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156135a957613571816001615bd6565b61357c9060086159d0565b61ffff16858281518110613592576135926156c6565b016020015160f81c901b919091179060010161355d565b5061ffff8116156135d35760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561362e576135ea816003615bd6565b6135f59060086159d0565b63ffffffff168661360783600261599b565b81518110613617576136176156c6565b016020015160f81c901b91909117906001016135d6565b5063ffffffff811660021461365657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156136ab5761366d81601f615bd6565b6136789060086159d0565b8761368483600661599b565b81518110613694576136946156c6565b016020015160f81c901b9190911790600101613659565b505f866026815181106136c0576136c06156c6565b016020015191976001600160f81b03199092161515965090945050505050565b6136e86144bd565b6136f182614508565b61137a8161457c565b5f8281525f80516020616034833981519152602052604081206002015481905f80516020615fd483398151915290600160801b90046001600160401b031661374285826145e4565b5f61374c87614807565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61379c8a858b611ea8565b6040518263ffffffff1660e01b81526004016137b8919061563d565b6020604051808303815f875af11580156137d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137f8919061564f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615fb483398151915290505f6138718460400151611859565b90505f60038251600581111561388957613889615445565b14806138a757506004825160058111156138a5576138a5615445565b145b156138b7575060c08101516138f4565b6002825160058111156138cc576138cc615445565b036138d85750426138f4565b815160405163170cc93360e21b81526104da919060040161562f565b84608001516001600160401b0316816001600160401b03161161391b57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061394090611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156139c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139e5919061564f565b95945050505050565b5f808251602e14613a2457825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613a7357613a3b816001615bd6565b613a469060086159d0565b61ffff16858281518110613a5c57613a5c6156c6565b016020015160f81c901b9190911790600101613a27565b5061ffff811615613a9d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613af857613ab4816003615bd6565b613abf9060086159d0565b63ffffffff1686613ad183600261599b565b81518110613ae157613ae16156c6565b016020015160f81c901b9190911790600101613aa0565b5063ffffffff811615613b1e57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7357613b3581601f615bd6565b613b409060086159d0565b87613b4c83600661599b565b81518110613b5c57613b5c6156c6565b016020015160f81c901b9190911790600101613b21565b505f805b6008811015613bd257613b8b816007615bd6565b613b969060086159d0565b6001600160401b031688613bab83602661599b565b81518110613bbb57613bbb6156c6565b016020015160f81c901b9190911790600101613b77565b5090969095509350505050565b613be7615204565b5f8281525f805160206160348339815191526020526040808220815160e0810190925280545f80516020615fd483398151915293929190829060ff166005811115613c3457613c34615445565b6005811115613c4557613c45615445565b8152602001600182018054613c59906155f7565b80601f0160208091040260200160405190810160405280929190818152602001828054613c85906155f7565b8015613cd05780601f10613ca757610100808354040283529160200191613cd0565b820191905f5260205f20905b815481529060010190602001808311613cb357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d3e57613d3e615445565b14613d71575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562f565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613db557613db5615445565b021790555060208201516001820190613dce90826158cc565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e6c85826136fa565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061487c565b5f610cf3825f80516020615f94833981519152546001600160a01b0316906148dd565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f8957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615fd483398151915242613fa8606086016040870161540c565b6001600160401b0316111580613fe25750613fc66202a3004261599b565b613fd6606086016040870161540c565b6001600160401b031610155b1561401c57613ff7606085016040860161540c565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b61403161402c6060860186615cbf565b614a36565b61404161402c6080860186615cbf565b60306140506020860186615be9565b905014614082576140646020850185615be9565b6040516326475b2f60e11b81526104da925060040190815260200190565b61408c8480615be9565b90505f036140b95761409e8480615be9565b604051633e08a12560e11b81526004016104da929190615cd3565b5f600882016140c88680615be9565b6040516140d6929190615aaa565b9081526020016040518091039020541461410f576140f48480615be9565b60405163a41f772f60e01b81526004016104da929190615cd3565b614119835f6145e4565b6040805160e08101909152815481525f908190614225906020810161413e8980615be9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614186908a018a615be9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141cf60608a0160408b0161540c565b6001600160401b031681526020016141ea60608a018a615cbf565b6141f390615d01565b815260200161420560808a018a615cbf565b61420e90615d01565b8152602001876001600160401b0316815250614b9f565b5f8281526006860160205260409020919350915061424382826158cc565b5081600884016142538880615be9565b604051614261929190615aaa565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061429d90859060040161563d565b6020604051808303815f875af11580156142b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142dd919061564f565b6040805160e0810190915290915080600181526020016142fd8980615be9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561438c5761438c615445565b0217905550602082015160018201906143a590826158cc565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144438880615be9565b604051614451929190615aaa565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061448f919061540c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661450657604051631afcd79f60e31b815260040160405180910390fd5b565b6145106144bd565b61451981614d8c565b614521614da5565b610dc26060820135608083013561453e60c0850160a0860161540c565b61454e60e0860160c08701615dc8565b61455f610100870160e08801615de1565b61010087013561457761014089016101208a01615666565b614db5565b6145846144bd565b5f80516020615f948339815191526001600160a01b0382166145c457604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615fd48339815191525f6001600160401b038084169085161115614618576146118385615ad9565b9050614625565b6146228484615ad9565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614687575060018401548151614683916001600160401b03169061599b565b8210155b156146ad576001600160401b0383166060820152818152604081015160208201526146cc565b82816060018181516146bf9190615ab9565b6001600160401b03169052505b60608101516146dc906064615c94565b602082015160018601546001600160401b0392909216916147079190600160401b900460ff166159d0565b101561473757606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b031681604001818151614752919061599b565b9052506040810180516001600160401b0387169190614772908390615bd6565b9052506001840154604082015160649161479791600160401b90910460ff16906159d0565b10156147be578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160348339815191526020526040812060020180545f80516020615fd4833981519152919060089061485190600160401b90046001600160401b0316615e01565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6148906001600160a01b03841683614f71565b905080515f141580156148b45750808060200190518101906148b29190615e1c565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614923573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614947919061564f565b905061495e6001600160a01b038516333086614f7e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156149a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149c6919061564f565b9050818111614a2c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139e58282615bd6565b614a43602082018261533f565b63ffffffff16158015614a635750614a5e6020820182615681565b151590505b15614aaa57614a75602082018261533f565b614a826020830183615681565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614ab76020820182615681565b9050614ac6602083018361533f565b63ffffffff161115614adf57614a75602082018261533f565b60015b614aef6020830183615681565b905081101561137a57614b056020830183615681565b614b10600184615bd6565b818110614b1f57614b1f6156c6565b9050602002016020810190614b349190615666565b6001600160a01b0316614b4a6020840184615681565b83818110614b5a57614b5a6156c6565b9050602002016020810190614b6f9190615666565b6001600160a01b03161015614b9757604051630dbc8d5f60e31b815260040160405180910390fd5b600101614ae2565b5f6060826040015151603014614bc85760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614c09988a986001989297929690959094909390929101615e37565b60405160208183030381529060405290505f5b84608001516020015151811015614c7b57818560800151602001518281518110614c4857614c486156c6565b6020026020010151604051602001614c61929190615ef1565b60408051601f198184030181529190529150600101614c1c565b5060a0840151805160209182015151604051614c9b938593929101615f27565b60405160208183030381529060405290505f5b8460a001516020015151811015614d0d57818560a00151602001518281518110614cda57614cda6156c6565b6020026020010151604051602001614cf3929190615ef1565b60408051601f198184030181529190529150600101614cae565b5060c0840151604051614d24918391602001615f62565b6040516020818303038152906040529050600281604051614d459190615877565b602060405180830381855afa158015614d60573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d83919061564f565b94909350915050565b614d946144bd565b614d9c614fb7565b610dc281614fbf565b614dad6144bd565b6145066150a7565b614dbd6144bd565b5f80516020615fb483398151915261ffff85161580614de1575061271061ffff8616115b15614e0557604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614e295760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614e3c5750600a60ff8516115b15614e5f5760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614ec6576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614ee65760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611ea183835f6150af565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613ef0565b6145066144bd565b614fc76144bd565b80355f80516020615fd48339815191529081556014614fec6060840160408501615de1565b60ff16118061500b57506150066060830160408401615de1565b60ff16155b1561503f576150206060830160408401615de1565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b61504f6060830160408401615de1565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615080604083016020840161540c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c236144bd565b6060814710156150d45760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b031684866040516150ef9190615877565b5f6040518083038185875af1925050503d805f8114615129576040519150601f19603f3d011682016040523d82523d5f602084013e61512e565b606091505b509150915061513e868383615148565b9695505050505050565b60608261515d57615158826151a4565b611ea1565b815115801561517457506001600160a01b0384163b155b1561519d57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611ea1565b8051156151b45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151d9906155f7565b5f825580601f106151e8575050565b601f0160209004905f5260205f2090810190610dc29190615241565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615255575f8155600101615242565b5090565b8015158114610dc2575f80fd5b803563ffffffff81168114615279575f80fd5b919050565b5f805f60608486031215615290575f80fd5b8335925060208401356152a281615259565b91506152b060408501615266565b90509250925092565b5f602082840312156152c9575f80fd5b5035919050565b5f80604083850312156152e1575f80fd5b82356001600160401b038111156152f6575f80fd5b830160808186031215615307575f80fd5b915061531560208401615266565b90509250929050565b5f806040838503121561532f575f80fd5b8235915061531560208401615266565b5f6020828403121561534f575f80fd5b611ea182615266565b803561ffff81168114615279575f80fd5b80356001600160401b0381168114615279575f80fd5b5f805f8060808587031215615392575f80fd5b84356001600160401b038111156153a7575f80fd5b850160a081880312156153b8575f80fd5b93506153c660208601615358565b92506153d460408601615369565b9396929550929360600135925050565b5f80604083850312156153f5575f80fd5b6153fe83615266565b946020939093013593505050565b5f6020828403121561541c575f80fd5b611ea182615369565b5f8060408385031215615436575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061546957615469615445565b9052565b5f5b8381101561548757818101518382015260200161546f565b50505f910152565b5f81518084526154a681602086016020860161546d565b601f01601f19169290920160200192915050565b602081526154cc602082018351615459565b5f602083015160e060408401526154e761010084018261548f565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f80828403610160811215615561575f80fd5b61014080821215615570575f80fd5b84935083013590506155818161553a565b809150509250929050565b5f806020838503121561559d575f80fd5b82356001600160401b03808211156155b3575f80fd5b818501915085601f8301126155c6575f80fd5b8135818111156155d4575f80fd5b8660208285010111156155e5575f80fd5b60209290920196919550909350505050565b600181811c9082168061560b57607f821691505b60208210810361562957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf38284615459565b602081525f611ea1602083018461548f565b5f6020828403121561565f575f80fd5b5051919050565b5f60208284031215615676575f80fd5b8135611ea18161553a565b5f808335601e19843603018112615696575f80fd5b8301803591506001600160401b038211156156af575f80fd5b6020019150600581901b360382131561384a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156ee575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561572e5761572e6156f8565b60405290565b604080519081016001600160401b038111828210171561572e5761572e6156f8565b604051601f8201601f191681016001600160401b038111828210171561577e5761577e6156f8565b604052919050565b5f6001600160401b0382111561579e5761579e6156f8565b50601f01601f191660200190565b5f82601f8301126157bb575f80fd5b81356157ce6157c982615786565b615756565b8181528460208386010111156157e2575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561580e575f80fd5b61581661570c565b82356001600160401b038082111561582c575f80fd5b615838368387016157ac565b8352602085013591508082111561584d575f80fd5b5061585a368286016157ac565b60208301525061586c60408401615369565b604082015292915050565b5f82516156ee81846020870161546d565b601f8211156104e357805f5260205f20601f840160051c810160208510156158ad5750805b601f840160051c820191505b81811015611715575f81556001016158b9565b81516001600160401b038111156158e5576158e56156f8565b6158f9816158f384546155f7565b84615888565b602080601f83116001811461592c575f84156159155750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b8281101561595a5788860151825594840194600190910190840161593b565b508582101561597757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615987565b5f63ffffffff8083168181036159c6576159c6615987565b6001019392505050565b8082028115828204841417610cf357610cf3615987565b5f82615a0157634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a1a57615a1a615445565b91905290565b5f60208083525f8454615a32816155f7565b806020870152604060018084165f8114615a535760018114615a6f57615a9c565b60ff19851660408a0152604084151560051b8a01019550615a9c565b895f5260205f205f5b85811015615a935781548b8201860152908301908801615a78565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0381811683821601908082111561200657612006615987565b6001600160401b0382811682821603908082111561200657612006615987565b805161527981615259565b5f8060408385031215615b15575f80fd5b82516001600160401b0380821115615b2b575f80fd5b9084019060608287031215615b3e575f80fd5b615b4661570c565b82518152602080840151615b598161553a565b82820152604084015183811115615b6e575f80fd5b80850194505087601f850112615b82575f80fd5b83519250615b926157c984615786565b8381528882858701011115615ba5575f80fd5b615bb48483830184880161546d565b80604084015250819550615bc9818801615af9565b9450505050509250929050565b81810381811115610cf357610cf3615987565b5f808335601e19843603018112615bfe575f80fd5b8301803591506001600160401b03821115615c17575f80fd5b60200191503681900382131561384a575f80fd5b5f8851615c3c818460208d0161546d565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615cb757615cb7615987565b505092915050565b5f8235603e198336030181126156ee575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d11575f80fd5b615d19615734565b615d2283615266565b81526020808401356001600160401b0380821115615d3e575f80fd5b9085019036601f830112615d50575f80fd5b813581811115615d6257615d626156f8565b8060051b9150615d73848301615756565b8181529183018401918481019036841115615d8c575f80fd5b938501935b83851015615db65784359250615da68361553a565b8282529385019390850190615d91565b94860194909452509295945050505050565b5f60208284031215615dd8575f80fd5b611ea182615358565b5f60208284031215615df1575f80fd5b813560ff81168114611ea1575f80fd5b5f6001600160401b038083168181036159c6576159c6615987565b5f60208284031215615e2c575f80fd5b8151611ea181615259565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e7d81602a850160208b0161546d565b865190830190615e9481602a840160208b0161546d565b60c087901b6001600160c01b031916602a9290910191820152615ec6603282018660e01b6001600160e01b0319169052565b615edf603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f0281846020880161546d565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f3881846020890161546d565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f7381846020880161546d565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516161ac3803806161ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61605f8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f36600461527d565b6104b3565b005b6102146102243660046152b8565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b61021461025636600461527d565b6106f6565b6102146102693660046152cf565b610701565b61021461027c36600461531d565b610c2b565b61029461028f3660046152b8565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d636600461527d565b610cf9565b6102146102e936600461533e565b610d04565b6103016102fc36600461537e565b610dc5565b60405190815260200161023f565b61021461031d3660046153e3565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461540b565b611065565b6102946103603660046152b8565b61109c565b6103015f81565b61021461037a36600461527d565b6110b0565b610231603081565b6102146103953660046152b8565b6110db565b6102146103a83660046153e3565b6111a6565b6103016103bb366004615424565b61137e565b6102146103ce36600461533e565b6113aa565b6103015f80516020615fb383398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b3660046152b8565b611533565b6103015f80516020615fd383398151915281565b6102146104423660046152b8565b61171c565b610231601481565b61046261045d3660046152b8565b611859565b60405161023f91906154b9565b6102946202a30081565b6103015f80516020615f9383398151915281565b61021461049b36600461554d565b6119a8565b6103016104ae36600461558b565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160338339815191526020526040808220815160e0810190925280545f80516020615fd383398151915293929190829060ff16600581111561053557610535615444565b600581111561054657610546615444565b815260200160018201805461055a906155f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906155f6565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615444565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562e565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e3a565b6040518263ffffffff1660e01b81526004016106b0919061563c565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061564e565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615fd38339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba919061564e565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615665565b6001600160a01b031614610837576108126060840160408501615665565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615680565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615680565b8363ffffffff1681811061087e5761087e6156c5565b905060200281019061089091906156d9565b610899906157fd565b80516040519192505f9160088801916108b191615876565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da919060040161563c565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615876565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610968919061564e565b90508086600801835f01516040516109809190615876565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615444565b021790555060208201516001820190610a1b90826158cb565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561599a565b8251604051919550610ad191615876565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906159ad565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836159cf565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e89565b60400151611f9f565b90505f610b958761212c565b90505f600282604051610ba89190615876565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be6919061564e565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612306565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c75615444565b14610c95578060405163170cc93360e21b81526004016104da919061562e565b6106f08383612341565b5f805f80516020615fb383398151915260030154610cbd90846159e6565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f08383836125bb565b610d0c6127a7565b5f80516020615fb38339815191525f80610d25846127de565b91509150610d3282612306565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c615444565b03610d91575f83815260088501602052604081208054919055610d8f8282612b1c565b505b610da781610da28460400151611065565b612b92565b505050505b610dc260015f8051602061601383398151915255565b50565b5f610dce6127a7565b610dda85858585612bc8565b9050610df260015f8051602061601383398151915255565b949350505050565b5f8181525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb383398151915293929190829060ff166003811115610e4757610e47615444565b6003811115610e5857610e58615444565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee5615444565b14610f06578251604051633b0d540d60e21b81526104da9190600401615a05565b600481516005811115610f1b57610f1b615444565b03610f3157610f2985612da1565b505050505050565b5f80610f48610f3f89611e89565b60400151612ff5565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b0384166159cf565b5f6110a682611859565b6080015192915050565b6110bb8383836125bb565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615fb38339815191525f6110f383611859565b519050600481600581111561110a5761110a615444565b1461112a578060405163170cc93360e21b81526004016104da919061562e565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612b1c565b6111ae6127a7565b5f8181525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb383398151915293929190829060ff1660038111156111fb576111fb615444565b600381111561120c5761120c615444565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128557611285615444565b146112a6578051604051633b0d540d60e21b81526104da9190600401615a05565b60046112b58260400151611859565b5160058111156112c7576112c7615444565b14611359575f6112d685611e89565b90505f806112e78360400151612ff5565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612da1565b505061137a60015f8051602061601383398151915255565b5050565b5f6113876127a7565b61139283338461324b565b9050610cf360015f8051602061601383398151915255565b5f80516020615fd38339815191525f806113cf6113c685611e89565b60400151613523565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f906155f6565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff16600581111561145957611459615444565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562e565b5f82815260068401602052604081206114a4916151cc565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb383398151915293929190829060ff16600381111561158057611580615444565b600381111561159157611591615444565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a615444565b1415801561162b575060038151600381111561162857611628615444565b14155b1561164c578051604051633b0d540d60e21b81526104da9190600401615a05565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611e3a565b6040518263ffffffff1660e01b81526004016116d5919061563c565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611715919061564e565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615fd38339815191529190611763906155f6565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad615444565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118199190600401615a1f565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e3919061564e565b611861615203565b5f8281525f80516020616033833981519152602052604090819020815160e0810190925280545f80516020615fd3833981519152929190829060ff1660058111156118ae576118ae615444565b60058111156118bf576118bf615444565b81526020016001820180546118d3906155f6565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff906155f6565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a84846136df565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615fd3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca9086908690615aa9565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb38339815191529284929091829060ff166003811115611b3057611b30615444565b6003811115611b4157611b41615444565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce615444565b14611bef578251604051633b0d540d60e21b81526104da9190600401615a05565b60208301516001600160a01b03163314611c8b575f8281526005850160205260409020546001600160a01b03163314611c28573361114b565b5f82815260058501602052604090205460a0820151611c5791600160b01b90046001600160401b031690615ab8565b6001600160401b0316421015611c8b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca057611ca0615444565b03611dce5760028401546080840151611cc2916001600160401b031690615ab8565b6001600160401b0316421015611cf65760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d0857611d068287612341565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d41918491611d3c9190615ad8565b6136f9565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d8284613850565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e339350505050565b600481516005811115611de357611de3615444565b03611e1757611df183613850565b5f898152600786016020526040902055611e0a88612da1565b6001945050505050611e33565b805160405163170cc93360e21b81526104da919060040161562e565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611eed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f149190810190615b03565b9150915080611f3657604051636b2f19e960e01b815260040160405180910390fd5b815115611f5c578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f98576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fd457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202357611feb816001615bd5565b611ff69060086159cf565b61ffff1684828151811061200c5761200c6156c5565b016020015160f81c901b9190911790600101611fd7565b5061ffff81161561204d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120a857612064816003615bd5565b61206f9060086159cf565b63ffffffff168561208183600261599a565b81518110612091576120916156c5565b016020015160f81c901b9190911790600101612050565b5063ffffffff8116156120ce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612123576120e581601f615bd5565b6120f09060086159cf565b866120fc83600661599a565b8151811061210c5761210c6156c5565b016020015160f81c901b91909117906001016120d1565b50949350505050565b60605f8083356020850135601461214887870160408901615665565b6121556060890189615680565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121db6060850185615680565b9050811015611f9857816121f26060860186615680565b83818110612202576122026156c5565b905060200281019061221491906156d9565b61221e9080615be8565b905061222d6060870187615680565b8481811061223d5761223d6156c5565b905060200281019061224f91906156d9565b6122599080615be8565b6122666060890189615680565b86818110612276576122766156c5565b905060200281019061228891906156d9565b612296906020810190615be8565b6122a360608b018b615680565b888181106122b3576122b36156c5565b90506020028101906122c591906156d9565b6122d690606081019060400161540b565b6040516020016122ec9796959493929190615c2a565b60408051601f1981840301815291905291506001016121ce565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561238c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123b39190810190615b03565b91509150806123d557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243c919061564e565b825114612462578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561249e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f806124ad84604001516139ed565b915091508187146124d45760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615fb3833981519152906001600160401b039081169083161115612591575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125b0565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615fb3833981519152816125d486613bde565b90506125df86612306565b6125ee57600192505050611e33565b5f8681526005830160205260409020546001600160a01b03163314612613573361114b565b5f86815260058301602052604090205460a082015161264291600160b01b90046001600160401b031690615ab8565b6001600160401b03168160c001516001600160401b031610156126895760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126a15761269a8786612341565b90506126bf565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126e490611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561274d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612771919061564e565b905080846008015f8a81526020019081526020015f205f828254612795919061599a565b90915550501515979650505050505050565b5f805160206160138339815191528054600119016127d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e7615203565b5f80516020615fd38339815191525f806128036113c687611e89565b91509150801561282a57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285b5761285b615444565b600581111561286c5761286c615444565b8152602001600182018054612880906155f6565b80601f01602080910402602001604051908101604052809291908181526020018280546128ac906155f6565b80156128f75780601f106128ce576101008083540402835291602001916128f7565b820191905f5260205f20905b8154815290600101906020018083116128da57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561296257612962615444565b14158015612983575060018151600581111561298057612980615444565b14155b156129a457805160405163170cc93360e21b81526104da919060040161562e565b6003815160058111156129b9576129b9615444565b036129c757600481526129cc565b600581525b8360080181602001516040516129e29190615876565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2657612a26615444565b021790555060208201516001820190612a3f90826158cb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae557612ae5615444565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615f9383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b77575f80fd5b505af1158015612b89573d5f803e3d5ffd5b50505050505050565b5f80516020615f938339815191525461137a906001600160a01b03168383613ec2565b60015f8051602061601383398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615fb383398151915290600160401b900461ffff9081169086161080612c1c575061271061ffff8616115b15612c4057604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c7c576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c8e5750806001015483115b15612caf5760405163222d164360e21b8152600481018490526024016104da565b5f612cb984613f21565b90505f612cc582610c9f565b90505f612cd28983613f44565b90506040518060800160405280612ce63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb383398151915293929190829060ff166003811115612dee57612dee615444565b6003811115612dff57612dff615444565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612e9c7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b8260800151612eab9190615ab8565b6001600160401b0316421015612edf5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b5f848152600684016020908152604080832080546001600160a81b03191681556001810184905560020183905560078601909152812080549082905590808215612f9a575f84815260058701602052604090205461271090612f4c90600160a01b900461ffff16856159cf565b612f5691906159e6565b915081866008015f8681526020019081526020015f205f828254612f7a919061599a565b90915550612f8a90508284615bd5565b9050612f9a856020015182612b1c565b612faf8560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461302c57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b600281101561307b57613043816001615bd5565b61304e9060086159cf565b61ffff16868281518110613064576130646156c5565b016020015160f81c901b919091179060010161302f565b5061ffff8116156130a55760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613100576130bc816003615bd5565b6130c79060086159cf565b63ffffffff16876130d983600261599a565b815181106130e9576130e96156c5565b016020015160f81c901b91909117906001016130a8565b5063ffffffff811660031461312857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561317d5761313f81601f615bd5565b61314a9060086159cf565b8861315683600661599a565b81518110613166576131666156c5565b016020015160f81c901b919091179060010161312b565b505f805b60088110156131dc57613195816007615bd5565b6131a09060086159cf565b6001600160401b0316896131b583602661599a565b815181106131c5576131c56156c5565b016020015160f81c901b9190911790600101613181565b505f805b600881101561323b576131f4816007615bd5565b6131ff9060086159cf565b6001600160401b03168a61321483602e61599a565b81518110613224576132246156c5565b016020015160f81c901b91909117906001016131e0565b5091989097509095509350505050565b5f5f80516020615fb38339815191528161326761028f85613f21565b90505f61327387611859565b905061327e87612306565b61329e576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156132b3576132b3615444565b146132d457805160405163170cc93360e21b81526104da919060040161562e565b5f8282608001516132e59190615ab8565b905083600201600a9054906101000a90046001600160401b0316826040015161330e9190615c93565b6001600160401b0316816001600160401b0316111561334b57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806133578a846136f9565b915091505f8a8360405160200161338592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561341857613418615444565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461355957825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156135a857613570816001615bd5565b61357b9060086159cf565b61ffff16858281518110613591576135916156c5565b016020015160f81c901b919091179060010161355c565b5061ffff8116156135d25760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561362d576135e9816003615bd5565b6135f49060086159cf565b63ffffffff168661360683600261599a565b81518110613616576136166156c5565b016020015160f81c901b91909117906001016135d5565b5063ffffffff811660021461365557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156136aa5761366c81601f615bd5565b6136779060086159cf565b8761368383600661599a565b81518110613693576136936156c5565b016020015160f81c901b9190911790600101613658565b505f866026815181106136bf576136bf6156c5565b016020015191976001600160f81b03199092161515965090945050505050565b6136e76144bc565b6136f082614507565b61137a8161457b565b5f8281525f80516020616033833981519152602052604081206002015481905f80516020615fd383398151915290600160801b90046001600160401b031661374185826145e3565b5f61374b87614806565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61379b8a858b611e3a565b6040518263ffffffff1660e01b81526004016137b7919061563c565b6020604051808303815f875af11580156137d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137f7919061564e565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615fb383398151915290505f6138708460400151611859565b90505f60038251600581111561388857613888615444565b14806138a657506004825160058111156138a4576138a4615444565b145b156138b6575060c08101516138f3565b6002825160058111156138cb576138cb615444565b036138d75750426138f3565b815160405163170cc93360e21b81526104da919060040161562e565b84608001516001600160401b0316816001600160401b03161161391a57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061393f90611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156139c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139e4919061564e565b95945050505050565b5f808251602e14613a2357825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613a7257613a3a816001615bd5565b613a459060086159cf565b61ffff16858281518110613a5b57613a5b6156c5565b016020015160f81c901b9190911790600101613a26565b5061ffff811615613a9c5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613af757613ab3816003615bd5565b613abe9060086159cf565b63ffffffff1686613ad083600261599a565b81518110613ae057613ae06156c5565b016020015160f81c901b9190911790600101613a9f565b5063ffffffff811615613b1d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7257613b3481601f615bd5565b613b3f9060086159cf565b87613b4b83600661599a565b81518110613b5b57613b5b6156c5565b016020015160f81c901b9190911790600101613b20565b505f805b6008811015613bd157613b8a816007615bd5565b613b959060086159cf565b6001600160401b031688613baa83602661599a565b81518110613bba57613bba6156c5565b016020015160f81c901b9190911790600101613b76565b5090969095509350505050565b613be6615203565b5f8281525f805160206160338339815191526020526040808220815160e0810190925280545f80516020615fd383398151915293929190829060ff166005811115613c3357613c33615444565b6005811115613c4457613c44615444565b8152602001600182018054613c58906155f6565b80601f0160208091040260200160405190810160405280929190818152602001828054613c84906155f6565b8015613ccf5780601f10613ca657610100808354040283529160200191613ccf565b820191905f5260205f20905b815481529060010190602001808311613cb257829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d3d57613d3d615444565b14613d70575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562e565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613db457613db4615444565b021790555060208201516001820190613dcd90826158cb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e6b85826136f9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061487b565b5f610cf3825f80516020615f93833981519152546001600160a01b0316906148dc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f8857604051637fab81e560e01b815260040160405180910390fd5b5f80516020615fd383398151915242613fa7606086016040870161540b565b6001600160401b0316111580613fe15750613fc56202a3004261599a565b613fd5606086016040870161540b565b6001600160401b031610155b1561401b57613ff6606085016040860161540b565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b61403061402b6060860186615cbe565b614a35565b61404061402b6080860186615cbe565b603061404f6020860186615be8565b905014614081576140636020850185615be8565b6040516326475b2f60e11b81526104da925060040190815260200190565b61408b8480615be8565b90505f036140b85761409d8480615be8565b604051633e08a12560e11b81526004016104da929190615cd2565b5f600882016140c78680615be8565b6040516140d5929190615aa9565b9081526020016040518091039020541461410e576140f38480615be8565b60405163a41f772f60e01b81526004016104da929190615cd2565b614118835f6145e3565b6040805160e08101909152815481525f908190614224906020810161413d8980615be8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614185908a018a615be8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141ce60608a0160408b0161540b565b6001600160401b031681526020016141e960608a018a615cbe565b6141f290615d00565b815260200161420460808a018a615cbe565b61420d90615d00565b8152602001876001600160401b0316815250614b9e565b5f8281526006860160205260409020919350915061424282826158cb565b5081600884016142528880615be8565b604051614260929190615aa9565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061429c90859060040161563c565b6020604051808303815f875af11580156142b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142dc919061564e565b6040805160e0810190915290915080600181526020016142fc8980615be8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561438b5761438b615444565b0217905550602082015160018201906143a490826158cb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144428880615be8565b604051614450929190615aa9565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061448e919061540b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661450557604051631afcd79f60e31b815260040160405180910390fd5b565b61450f6144bc565b61451881614d8b565b614520614da4565b610dc26060820135608083013561453d60c0850160a0860161540b565b61454d60e0860160c08701615dc7565b61455e610100870160e08801615de0565b61010087013561457661014089016101208a01615665565b614db4565b6145836144bc565b5f80516020615f938339815191526001600160a01b0382166145c357604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615fd38339815191525f6001600160401b038084169085161115614617576146108385615ad8565b9050614624565b6146218484615ad8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614686575060018401548151614682916001600160401b03169061599a565b8210155b156146ac576001600160401b0383166060820152818152604081015160208201526146cb565b82816060018181516146be9190615ab8565b6001600160401b03169052505b60608101516146db906064615c93565b602082015160018601546001600160401b0392909216916147069190600160401b900460ff166159cf565b101561473657606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b031681604001818151614751919061599a565b9052506040810180516001600160401b0387169190614771908390615bd5565b9052506001840154604082015160649161479691600160401b90910460ff16906159cf565b10156147bd578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160338339815191526020526040812060020180545f80516020615fd3833981519152919060089061485090600160401b90046001600160401b0316615e00565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61488f6001600160a01b03841683614f70565b905080515f141580156148b35750808060200190518101906148b19190615e1b565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614922573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614946919061564e565b905061495d6001600160a01b038516333086614f7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156149a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149c5919061564e565b9050818111614a2b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139e48282615bd5565b614a42602082018261533e565b63ffffffff16158015614a625750614a5d6020820182615680565b151590505b15614aa957614a74602082018261533e565b614a816020830183615680565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614ab66020820182615680565b9050614ac5602083018361533e565b63ffffffff161115614ade57614a74602082018261533e565b60015b614aee6020830183615680565b905081101561137a57614b046020830183615680565b614b0f600184615bd5565b818110614b1e57614b1e6156c5565b9050602002016020810190614b339190615665565b6001600160a01b0316614b496020840184615680565b83818110614b5957614b596156c5565b9050602002016020810190614b6e9190615665565b6001600160a01b03161015614b9657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614ae1565b5f6060826040015151603014614bc75760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614c08988a986001989297929690959094909390929101615e36565b60405160208183030381529060405290505f5b84608001516020015151811015614c7a57818560800151602001518281518110614c4757614c476156c5565b6020026020010151604051602001614c60929190615ef0565b60408051601f198184030181529190529150600101614c1b565b5060a0840151805160209182015151604051614c9a938593929101615f26565b60405160208183030381529060405290505f5b8460a001516020015151811015614d0c57818560a00151602001518281518110614cd957614cd96156c5565b6020026020010151604051602001614cf2929190615ef0565b60408051601f198184030181529190529150600101614cad565b5060c0840151604051614d23918391602001615f61565b6040516020818303038152906040529050600281604051614d449190615876565b602060405180830381855afa158015614d5f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d82919061564e565b94909350915050565b614d936144bc565b614d9b614fb6565b610dc281614fbe565b614dac6144bc565b6145056150a6565b614dbc6144bc565b5f80516020615fb383398151915261ffff85161580614de0575061271061ffff8616115b15614e0457604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614e285760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614e3b5750600a60ff8516115b15614e5e5760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614ec5576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614ee55760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3383835f6150ae565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613eef565b6145056144bc565b614fc66144bc565b80355f80516020615fd38339815191529081556014614feb6060840160408501615de0565b60ff16118061500a57506150056060830160408401615de0565b60ff16155b1561503e5761501f6060830160408401615de0565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b61504e6060830160408401615de0565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561507f604083016020840161540b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612bb56144bc565b6060814710156150d35760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b031684866040516150ee9190615876565b5f6040518083038185875af1925050503d805f8114615128576040519150601f19603f3d011682016040523d82523d5f602084013e61512d565b606091505b509150915061513d868383615147565b9695505050505050565b60608261515c57615157826151a3565b611e33565b815115801561517357506001600160a01b0384163b155b1561519c57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e33565b8051156151b35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151d8906155f6565b5f825580601f106151e7575050565b601f0160209004905f5260205f2090810190610dc29190615240565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615254575f8155600101615241565b5090565b8015158114610dc2575f80fd5b803563ffffffff81168114615278575f80fd5b919050565b5f805f6060848603121561528f575f80fd5b8335925060208401356152a181615258565b91506152af60408501615265565b90509250925092565b5f602082840312156152c8575f80fd5b5035919050565b5f80604083850312156152e0575f80fd5b82356001600160401b038111156152f5575f80fd5b830160808186031215615306575f80fd5b915061531460208401615265565b90509250929050565b5f806040838503121561532e575f80fd5b8235915061531460208401615265565b5f6020828403121561534e575f80fd5b611e3382615265565b803561ffff81168114615278575f80fd5b80356001600160401b0381168114615278575f80fd5b5f805f8060808587031215615391575f80fd5b84356001600160401b038111156153a6575f80fd5b850160a081880312156153b7575f80fd5b93506153c560208601615357565b92506153d360408601615368565b9396929550929360600135925050565b5f80604083850312156153f4575f80fd5b6153fd83615265565b946020939093013593505050565b5f6020828403121561541b575f80fd5b611e3382615368565b5f8060408385031215615435575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061546857615468615444565b9052565b5f5b8381101561548657818101518382015260200161546e565b50505f910152565b5f81518084526154a581602086016020860161546c565b601f01601f19169290920160200192915050565b602081526154cb602082018351615458565b5f602083015160e060408401526154e661010084018261548e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f80828403610160811215615560575f80fd5b6101408082121561556f575f80fd5b849350830135905061558081615539565b809150509250929050565b5f806020838503121561559c575f80fd5b82356001600160401b03808211156155b2575f80fd5b818501915085601f8301126155c5575f80fd5b8135818111156155d3575f80fd5b8660208285010111156155e4575f80fd5b60209290920196919550909350505050565b600181811c9082168061560a57607f821691505b60208210810361562857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf38284615458565b602081525f611e33602083018461548e565b5f6020828403121561565e575f80fd5b5051919050565b5f60208284031215615675575f80fd5b8135611e3381615539565b5f808335601e19843603018112615695575f80fd5b8301803591506001600160401b038211156156ae575f80fd5b6020019150600581901b3603821315613849575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156ed575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561572d5761572d6156f7565b60405290565b604080519081016001600160401b038111828210171561572d5761572d6156f7565b604051601f8201601f191681016001600160401b038111828210171561577d5761577d6156f7565b604052919050565b5f6001600160401b0382111561579d5761579d6156f7565b50601f01601f191660200190565b5f82601f8301126157ba575f80fd5b81356157cd6157c882615785565b615755565b8181528460208386010111156157e1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561580d575f80fd5b61581561570b565b82356001600160401b038082111561582b575f80fd5b615837368387016157ab565b8352602085013591508082111561584c575f80fd5b50615859368286016157ab565b60208301525061586b60408401615368565b604082015292915050565b5f82516156ed81846020870161546c565b601f8211156104e357805f5260205f20601f840160051c810160208510156158ac5750805b601f840160051c820191505b81811015611715575f81556001016158b8565b81516001600160401b038111156158e4576158e46156f7565b6158f8816158f284546155f6565b84615887565b602080601f83116001811461592b575f84156159145750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b828110156159595788860151825594840194600190910190840161593a565b508582101561597657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615986565b5f63ffffffff8083168181036159c5576159c5615986565b6001019392505050565b8082028115828204841417610cf357610cf3615986565b5f82615a0057634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a1957615a19615444565b91905290565b5f60208083525f8454615a31816155f6565b806020870152604060018084165f8114615a525760018114615a6e57615a9b565b60ff19851660408a0152604084151560051b8a01019550615a9b565b895f5260205f205f5b85811015615a925781548b8201860152908301908801615a77565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f9857611f98615986565b6001600160401b03828116828216039080821115611f9857611f98615986565b805161527881615258565b5f8060408385031215615b14575f80fd5b82516001600160401b0380821115615b2a575f80fd5b9084019060608287031215615b3d575f80fd5b615b4561570b565b82518152602080840151615b5881615539565b82820152604084015183811115615b6d575f80fd5b80850194505087601f850112615b81575f80fd5b83519250615b916157c884615785565b8381528882858701011115615ba4575f80fd5b615bb38483830184880161546c565b80604084015250819550615bc8818801615af8565b9450505050509250929050565b81810381811115610cf357610cf3615986565b5f808335601e19843603018112615bfd575f80fd5b8301803591506001600160401b03821115615c16575f80fd5b602001915036819003821315613849575f80fd5b5f8851615c3b818460208d0161546c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615cb657615cb6615986565b505092915050565b5f8235603e198336030181126156ed575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d10575f80fd5b615d18615733565b615d2183615265565b81526020808401356001600160401b0380821115615d3d575f80fd5b9085019036601f830112615d4f575f80fd5b813581811115615d6157615d616156f7565b8060051b9150615d72848301615755565b8181529183018401918481019036841115615d8b575f80fd5b938501935b83851015615db55784359250615da583615539565b8282529385019390850190615d90565b94860194909452509295945050505050565b5f60208284031215615dd7575f80fd5b611e3382615357565b5f60208284031215615df0575f80fd5b813560ff81168114611e33575f80fd5b5f6001600160401b038083168181036159c5576159c5615986565b5f60208284031215615e2b575f80fd5b8151611e3381615258565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e7c81602a850160208b0161546c565b865190830190615e9381602a840160208b0161546c565b60c087901b6001600160c01b031916602a9290910191820152615ec5603282018660e01b6001600160e01b0319169052565b615ede603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f0181846020880161546c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f3781846020890161546c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f7281846020880161546c565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index a78ba17b0..65b8b0a39 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615eb8380380615eb883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d6b8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004615022565b610615565b005b348015610221575f80fd5b5061021461023036600461505d565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004615022565b610858565b34801561028a575f80fd5b50610214610299366004615074565b610863565b3480156102a9575f80fd5b506102146102b83660046150c2565b610d8d565b3480156102c8575f80fd5b506102dc6102d736600461505d565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004615022565b610e5b565b348015610378575f80fd5b506102146103873660046150e3565b610e66565b348015610397575f80fd5b506102146103a63660046150fc565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee36600461513a565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b36600461505d565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004615022565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b5061021461048036600461505d565b611208565b348015610490575f80fd5b5061021461049f3660046150fc565b6112d3565b3480156104af575f80fd5b506102146104be3660046150e3565b6114ab565b6103f36104d1366004615164565b611634565b3480156104e1575f80fd5b506103f35f80516020615cbf83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a36600461505d565b611668565b34801561053a575f80fd5b506103f35f80516020615cdf83398151915281565b34801561055a575f80fd5b5061021461056936600461505d565b611851565b348015610579575f80fd5b506102146105883660046151b8565b61198e565b6103f361059b36600461505d565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce36600461505d565b611a9c565b6040516102579190615244565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f36106103660046152c4565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d3f8339815191526020526040808220815160e0810190925280545f80516020615cdf83398151915293929190829060ff166005811115610697576106976151cf565b60058111156106a8576106a86151cf565b81526020016001820180546106bc9061532f565b80601f01602080910402602001604051908101604052809291908181526020018280546106e89061532f565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6151cf565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615361565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f612005565b6040518263ffffffff1660e01b8152600401610812919061536f565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615381565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615cdf8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615381565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016153ac565b6001600160a01b0316146109995761097460608401604085016153ac565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856153c7565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886153c7565b8363ffffffff168181106109e0576109e061540c565b90506020028101906109f29190615420565b6109fb90615544565b80516040519192505f916008880191610a13916155bd565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161536f565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c916155bd565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615381565b90508086600801835f0151604051610ae291906155bd565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646151cf565b021790555060208201516001820190610b7d9082615612565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c229116856156e1565b8251604051919550610c33916155bd565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c88906156f4565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615716565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286612054565b6040015161216a565b90505f610cf7876122f7565b90505f600282604051610d0a91906155bd565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615381565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d96826124d1565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd76151cf565b14610df7578060405163170cc93360e21b815260040161063c9190615361565b610852838361250c565b5f805f80516020615cbf83398151915260030154610e1f908461572d565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612786565b610e6e612972565b5f80516020615cbf8339815191525f80610e87846129a9565b91509150610e94826124d1565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece6151cf565b03610ef3575f83815260088501602052604081208054919055610ef18282612ce7565b505b610f0981610f048460400151611192565b612d45565b505050505b610f2460015f80516020615d1f83398151915255565b50565b5f8181525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf83398151915293929190829060ff166003811115610f7457610f746151cf565b6003811115610f8557610f856151cf565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b9050600183516003811115611012576110126151cf565b14611033578251604051633b0d540d60e21b815261063c919060040161574c565b600481516005811115611048576110486151cf565b0361105e5761105685612d6b565b505050505050565b5f8061107561106c89612054565b60400151612f52565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b038416615716565b5f6111d382611a9c565b6080015192915050565b6111e8838383612786565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615cbf8339815191525f61122083611a9c565b5190506004816005811115611237576112376151cf565b14611257578060405163170cc93360e21b815260040161063c9190615361565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612ce7565b6112db612972565b5f8181525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf83398151915293929190829060ff166003811115611328576113286151cf565b6003811115611339576113396151cf565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b26151cf565b146113d3578051604051633b0d540d60e21b815261063c919060040161574c565b60046113e28260400151611a9c565b5160058111156113f4576113f46151cf565b14611486575f61140385612054565b90505f806114148360400151612f52565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612d6b565b50506114a760015f80516020615d1f83398151915255565b5050565b5f80516020615cdf8339815191525f806114d06114c785612054565b604001516131a8565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546115109061532f565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a6151cf565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615361565b5f82815260068401602052604081206115a591614f76565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d612972565b61164984848434613364565b905061166160015f80516020615d1f83398151915255565b9392505050565b5f8181525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf83398151915293929190829060ff1660038111156116b5576116b56151cf565b60038111156116c6576116c66151cf565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f6151cf565b14158015611760575060038151600381111561175d5761175d6151cf565b14155b15611781578051604051633b0d540d60e21b815261063c919060040161574c565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151612005565b6040518263ffffffff1660e01b815260040161180a919061536f565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615381565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615cdf83398151915291906118989061532f565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e26151cf565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615361565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e9190600401615766565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615381565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f83613532565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a74612972565b611a7f823334613543565b9050611a9760015f80516020615d1f83398151915255565b919050565b611aa4614fad565b5f8281525f80516020615d3f833981519152602052604090819020815160e0810190925280545f80516020615cdf833981519152929190829060ff166005811115611af157611af16151cf565b6005811115611b0257611b026151cf565b8152602001600182018054611b169061532f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b429061532f565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615cdf833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e90869086906157f0565b90815260200160405180910390205491505092915050565b5f8381525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf8339815191529284929091829060ff166003811115611c9457611c946151cf565b6003811115611ca557611ca56151cf565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d326151cf565b14611d53578251604051633b0d540d60e21b815261063c919060040161574c565b60208301516001600160a01b03163314611def575f8281526005850160205260409020546001600160a01b03163314611d8c5733611278565b5f82815260058501602052604090205460a0820151611dbb91600160b01b90046001600160401b0316906157ff565b6001600160401b0316421015611def5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0457611e046151cf565b03611f325760028401546080840151611e26916001600160401b0316906157ff565b6001600160401b0316421015611e5a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e6c57611e6a828761250c565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ea5918491611ea0919061581f565b613818565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee68461396f565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611f4757611f476151cf565b03611fe9577fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03168360800151611f8691906157ff565b6001600160401b0316421015611fba5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b611fc38361396f565b5f898152600786016020526040902055611fdc88612d6b565b6001945050505050611661565b805160405163170cc93360e21b815261063c9190600401615361565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120df919081019061584a565b915091508061210157604051636b2f19e960e01b815260040160405180910390fd5b815115612127578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612163576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461219f57815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b60028110156121ee576121b681600161591c565b6121c1906008615716565b61ffff168482815181106121d7576121d761540c565b016020015160f81c901b91909117906001016121a2565b5061ffff8116156122185760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156122735761222f81600361591c565b61223a906008615716565b63ffffffff168561224c8360026156e1565b8151811061225c5761225c61540c565b016020015160f81c901b919091179060010161221b565b5063ffffffff81161561229957604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122ee576122b081601f61591c565b6122bb906008615716565b866122c78360066156e1565b815181106122d7576122d761540c565b016020015160f81c901b919091179060010161229c565b50949350505050565b60605f80833560208501356014612313878701604089016153ac565b61232060608901896153c7565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123a660608501856153c7565b905081101561216357816123bd60608601866153c7565b838181106123cd576123cd61540c565b90506020028101906123df9190615420565b6123e9908061592f565b90506123f860608701876153c7565b848181106124085761240861540c565b905060200281019061241a9190615420565b612424908061592f565b61243160608901896153c7565b868181106124415761244161540c565b90506020028101906124539190615420565b61246190602081019061592f565b61246e60608b018b6153c7565b8881811061247e5761247e61540c565b90506020028101906124909190615420565b6124a190606081019060400161513a565b6040516020016124b79796959493929190615971565b60408051601f198184030181529190529150600101612399565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612557573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261257e919081019061584a565b91509150806125a057604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126079190615381565b82511461262d578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612669576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806126788460400151613b0c565b9150915081871461269f5760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615cbf833981519152906001600160401b03908116908316111561275c575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261277b565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615cbf8339815191528161279f86613cfd565b90506127aa866124d1565b6127b957600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127de5733611278565b5f86815260058301602052604090205460a082015161280d91600160b01b90046001600160401b0316906157ff565b6001600160401b03168160c001516001600160401b031610156128545760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f851561286c57612865878661250c565b905061288a565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906128af90611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612918573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061293c9190615381565b905080846008015f8a81526020019081526020015f205f82825461296091906156e1565b90915550501515979650505050505050565b5f80516020615d1f8339815191528054600119016129a357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6129b2614fad565b5f80516020615cdf8339815191525f806129ce6114c787612054565b9150915080156129f557604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612a2657612a266151cf565b6005811115612a3757612a376151cf565b8152602001600182018054612a4b9061532f565b80601f0160208091040260200160405190810160405280929190818152602001828054612a779061532f565b8015612ac25780601f10612a9957610100808354040283529160200191612ac2565b820191905f5260205f20905b815481529060010190602001808311612aa557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612b2d57612b2d6151cf565b14158015612b4e5750600181516005811115612b4b57612b4b6151cf565b14155b15612b6f57805160405163170cc93360e21b815261063c9190600401615361565b600381516005811115612b8457612b846151cf565b03612b925760048152612b97565b600581525b836008018160200151604051612bad91906155bd565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612bf157612bf16151cf565b021790555060208201516001820190612c0a9082615612565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612cb057612cb06151cf565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612d33575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613fe1565b60015f80516020615d1f83398151915255565b5f8181525f80516020615cff8339815191526020526040808220815160e0810190925280545f80516020615cbf83398151915293929190829060ff166003811115612db857612db86151cf565b6003811115612dc957612dc96151cf565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612ef7575f84815260058701602052604090205461271090612ea990600160a01b900461ffff1685615716565b612eb3919061572d565b915081866008015f8681526020019081526020015f205f828254612ed791906156e1565b90915550612ee79050828461591c565b9050612ef7856020015182612ce7565b612f0c8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f8957835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612fd857612fa081600161591c565b612fab906008615716565b61ffff16868281518110612fc157612fc161540c565b016020015160f81c901b9190911790600101612f8c565b5061ffff8116156130025760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561305d5761301981600361591c565b613024906008615716565b63ffffffff16876130368360026156e1565b815181106130465761304661540c565b016020015160f81c901b9190911790600101613005565b5063ffffffff811660031461308557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130da5761309c81601f61591c565b6130a7906008615716565b886130b38360066156e1565b815181106130c3576130c361540c565b016020015160f81c901b9190911790600101613088565b505f805b6008811015613139576130f281600761591c565b6130fd906008615716565b6001600160401b0316896131128360266156e1565b815181106131225761312261540c565b016020015160f81c901b91909117906001016130de565b505f805b60088110156131985761315181600761591c565b61315c906008615716565b6001600160401b03168a61317183602e6156e1565b815181106131815761318161540c565b016020015160f81c901b919091179060010161313d565b5091989097509095509350505050565b5f8082516027146131de57825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561322d576131f581600161591c565b613200906008615716565b61ffff168582815181106132165761321661540c565b016020015160f81c901b91909117906001016131e1565b5061ffff8116156132575760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156132b25761326e81600361591c565b613279906008615716565b63ffffffff168661328b8360026156e1565b8151811061329b5761329b61540c565b016020015160f81c901b919091179060010161325a565b5063ffffffff81166002146132da57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561332f576132f181601f61591c565b6132fc906008615716565b876133088360066156e1565b815181106133185761331861540c565b016020015160f81c901b91909117906001016132dd565b505f866026815181106133445761334461540c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615cbf83398151915290600160401b900461ffff90811690861610806133b8575061271061ffff8616115b156133dc57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613418576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b805483108061342a5750806001015483115b1561344b5760405163222d164360e21b81526004810184905260240161063c565b825f61345682610e01565b90505f6134638983614074565b905060405180608001604052806134773390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61353a6145ec565b610f2481614637565b5f5f80516020615cbf8339815191528161355c84610e01565b90505f61356887611a9c565b9050613573876124d1565b613593576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156135a8576135a86151cf565b146135c957805160405163170cc93360e21b815261063c9190600401615361565b5f8282608001516135da91906157ff565b905083600201600a9054906101000a90046001600160401b0316826040015161360391906159da565b6001600160401b0316816001600160401b0316111561364057604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061364c8a84613818565b915091505f8a8360405160200161367a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561370d5761370d6151cf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d3f833981519152602052604081206002015481905f80516020615cdf83398151915290600160801b90046001600160401b031661386085826146ab565b5f61386a876148ce565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6138ba8a858b612005565b6040518263ffffffff1660e01b81526004016138d6919061536f565b6020604051808303815f875af11580156138f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139169190615381565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615cbf83398151915290505f61398f8460400151611a9c565b90505f6003825160058111156139a7576139a76151cf565b14806139c557506004825160058111156139c3576139c36151cf565b145b156139d5575060c0810151613a12565b6002825160058111156139ea576139ea6151cf565b036139f6575042613a12565b815160405163170cc93360e21b815261063c9190600401615361565b84608001516001600160401b0316816001600160401b031611613a3957505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613a5e90611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613adf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b039190615381565b95945050505050565b5f808251602e14613b4257825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b9157613b5981600161591c565b613b64906008615716565b61ffff16858281518110613b7a57613b7a61540c565b016020015160f81c901b9190911790600101613b45565b5061ffff811615613bbb5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613c1657613bd281600361591c565b613bdd906008615716565b63ffffffff1686613bef8360026156e1565b81518110613bff57613bff61540c565b016020015160f81c901b9190911790600101613bbe565b5063ffffffff811615613c3c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c9157613c5381601f61591c565b613c5e906008615716565b87613c6a8360066156e1565b81518110613c7a57613c7a61540c565b016020015160f81c901b9190911790600101613c3f565b505f805b6008811015613cf057613ca981600761591c565b613cb4906008615716565b6001600160401b031688613cc98360266156e1565b81518110613cd957613cd961540c565b016020015160f81c901b9190911790600101613c95565b5090969095509350505050565b613d05614fad565b5f8281525f80516020615d3f8339815191526020526040808220815160e0810190925280545f80516020615cdf83398151915293929190829060ff166005811115613d5257613d526151cf565b6005811115613d6357613d636151cf565b8152602001600182018054613d779061532f565b80601f0160208091040260200160405190810160405280929190818152602001828054613da39061532f565b8015613dee5780601f10613dc557610100808354040283529160200191613dee565b820191905f5260205f20905b815481529060010190602001808311613dd157829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613e5c57613e5c6151cf565b14613e8f575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615361565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ed357613ed36151cf565b021790555060208201516001820190613eec9082615612565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f8a8582613818565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156140045760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461404d576040519150601f19603f3d011682016040523d82523d5f602084013e614052565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140b857604051637fab81e560e01b815260040160405180910390fd5b5f80516020615cdf833981519152426140d7606086016040870161513a565b6001600160401b031611158061411157506140f56202a300426156e1565b614105606086016040870161513a565b6001600160401b031610155b1561414b57614126606085016040860161513a565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61416061415b6060860186615a05565b614943565b61417061415b6080860186615a05565b603061417f602086018661592f565b9050146141b157614193602085018561592f565b6040516326475b2f60e11b815261063c925060040190815260200190565b6141bb848061592f565b90505f036141e8576141cd848061592f565b604051633e08a12560e11b815260040161063c929190615a19565b5f600882016141f7868061592f565b6040516142059291906157f0565b9081526020016040518091039020541461423e57614223848061592f565b60405163a41f772f60e01b815260040161063c929190615a19565b614248835f6146ab565b6040805160e08101909152815481525f908190614354906020810161426d898061592f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906142b5908a018a61592f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016142fe60608a0160408b0161513a565b6001600160401b0316815260200161431960608a018a615a05565b61432290615a47565b815260200161433460808a018a615a05565b61433d90615a47565b8152602001876001600160401b0316815250614aac565b5f828152600686016020526040902091935091506143728282615612565b508160088401614382888061592f565b6040516143909291906157f0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143cc90859060040161536f565b6020604051808303815f875af11580156143e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061440c9190615381565b6040805160e08101909152909150806001815260200161442c898061592f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156144bb576144bb6151cf565b0217905550602082015160018201906144d49082615612565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580614572888061592f565b6040516145809291906157f0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145be919061513a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661463557604051631afcd79f60e31b815260040160405180910390fd5b565b61463f6145ec565b61464881614c99565b614650614cb2565b610f246060820135608083013561466d60c0850160a0860161513a565b61467d60e0860160c08701615b0e565b61468e610100870160e08801615b27565b6101008701356146a661014089016101208a016153ac565b614cc2565b5f80516020615cdf8339815191525f6001600160401b0380841690851611156146df576146d8838561581f565b90506146ec565b6146e9848461581f565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061474e57506001840154815161474a916001600160401b0316906156e1565b8210155b15614774576001600160401b038316606082015281815260408101516020820152614793565b828160600181815161478691906157ff565b6001600160401b03169052505b60608101516147a39060646159da565b602082015160018601546001600160401b0392909216916147ce9190600160401b900460ff16615716565b10156147fe57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161481991906156e1565b9052506040810180516001600160401b038716919061483990839061591c565b9052506001840154604082015160649161485e91600160401b90910460ff1690615716565b1015614885578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d3f8339815191526020526040812060020180545f80516020615cdf833981519152919060089061491890600160401b90046001600160401b0316615b47565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61495060208201826150e3565b63ffffffff16158015614970575061496b60208201826153c7565b151590505b156149b75761498260208201826150e3565b61498f60208301836153c7565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149c460208201826153c7565b90506149d360208301836150e3565b63ffffffff1611156149ec5761498260208201826150e3565b60015b6149fc60208301836153c7565b90508110156114a757614a1260208301836153c7565b614a1d60018461591c565b818110614a2c57614a2c61540c565b9050602002016020810190614a4191906153ac565b6001600160a01b0316614a5760208401846153c7565b83818110614a6757614a6761540c565b9050602002016020810190614a7c91906153ac565b6001600160a01b03161015614aa457604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149ef565b5f6060826040015151603014614ad55760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b16988a986001989297929690959094909390929101615b62565b60405160208183030381529060405290505f5b84608001516020015151811015614b8857818560800151602001518281518110614b5557614b5561540c565b6020026020010151604051602001614b6e929190615c1c565b60408051601f198184030181529190529150600101614b29565b5060a0840151805160209182015151604051614ba8938593929101615c52565b60405160208183030381529060405290505f5b8460a001516020015151811015614c1a57818560a00151602001518281518110614be757614be761540c565b6020026020010151604051602001614c00929190615c1c565b60408051601f198184030181529190529150600101614bbb565b5060c0840151604051614c31918391602001615c8d565b6040516020818303038152906040529050600281604051614c5291906155bd565b602060405180830381855afa158015614c6d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c909190615381565b94909350915050565b614ca16145ec565b614ca9614e7e565b610f2481614e86565b614cba6145ec565b614635614f6e565b614cca6145ec565b5f80516020615cbf83398151915261ffff85161580614cee575061271061ffff8616115b15614d1257604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614d365760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614d495750600a60ff8516115b15614d6c5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614dd3576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614df35760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6146356145ec565b614e8e6145ec565b80355f80516020615cdf8339815191529081556014614eb36060840160408501615b27565b60ff161180614ed25750614ecd6060830160408401615b27565b60ff16155b15614f0657614ee76060830160408401615b27565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614f166060830160408401615b27565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f47604083016020840161513a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d586145ec565b508054614f829061532f565b5f825580601f10614f91575050565b601f0160209004905f5260205f2090810190610f249190614fea565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ffe575f8155600101614feb565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215615034575f80fd5b83359250602084013561504681615002565b91506150546040850161500f565b90509250925092565b5f6020828403121561506d575f80fd5b5035919050565b5f8060408385031215615085575f80fd5b82356001600160401b0381111561509a575f80fd5b8301608081860312156150ab575f80fd5b91506150b96020840161500f565b90509250929050565b5f80604083850312156150d3575f80fd5b823591506150b96020840161500f565b5f602082840312156150f3575f80fd5b6116618261500f565b5f806040838503121561510d575f80fd5b6151168361500f565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f6020828403121561514a575f80fd5b61166182615124565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615176575f80fd5b83356001600160401b0381111561518b575f80fd5b840160a0818703121561519c575f80fd5b92506151aa60208501615153565b915061505460408501615124565b5f61014082840312156151c9575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106151f3576151f36151cf565b9052565b5f5b838110156152115781810151838201526020016151f9565b50505f910152565b5f81518084526152308160208601602086016151f7565b601f01601f19169290920160200192915050565b602081526152566020820183516151e3565b5f602083015160e06040840152615271610100840182615219565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156152d5575f80fd5b82356001600160401b03808211156152eb575f80fd5b818501915085601f8301126152fe575f80fd5b81358181111561530c575f80fd5b86602082850101111561531d575f80fd5b60209290920196919550909350505050565b600181811c9082168061534357607f821691505b6020821081036151c957634e487b7160e01b5f52602260045260245ffd5b60208101610e5582846151e3565b602081525f6116616020830184615219565b5f60208284031215615391575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f602082840312156153bc575f80fd5b813561166181615398565b5f808335601e198436030181126153dc575f80fd5b8301803591506001600160401b038211156153f5575f80fd5b6020019150600581901b3603821315613968575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615434575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154745761547461543e565b60405290565b604080519081016001600160401b03811182821017156154745761547461543e565b604051601f8201601f191681016001600160401b03811182821017156154c4576154c461543e565b604052919050565b5f6001600160401b038211156154e4576154e461543e565b50601f01601f191660200190565b5f82601f830112615501575f80fd5b813561551461550f826154cc565b61549c565b818152846020838601011115615528575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615554575f80fd5b61555c615452565b82356001600160401b0380821115615572575f80fd5b61557e368387016154f2565b83526020850135915080821115615593575f80fd5b506155a0368286016154f2565b6020830152506155b260408401615124565b604082015292915050565b5f82516154348184602087016151f7565b601f82111561064557805f5260205f20601f840160051c810160208510156155f35750805b601f840160051c820191505b8181101561184a575f81556001016155ff565b81516001600160401b0381111561562b5761562b61543e565b61563f81615639845461532f565b846155ce565b602080601f831160018114615672575f841561565b5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b828110156156a057888601518255948401946001909101908401615681565b50858210156156bd57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e556156cd565b5f63ffffffff80831681810361570c5761570c6156cd565b6001019392505050565b8082028115828204841417610e5557610e556156cd565b5f8261574757634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615760576157606151cf565b91905290565b5f60208083525f84546157788161532f565b806020870152604060018084165f811461579957600181146157b5576157e2565b60ff19851660408a0152604084151560051b8a010195506157e2565b895f5260205f205f5b858110156157d95781548b82018601529083019088016157be565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115612163576121636156cd565b6001600160401b03828116828216039080821115612163576121636156cd565b8051611a9781615002565b5f806040838503121561585b575f80fd5b82516001600160401b0380821115615871575f80fd5b9084019060608287031215615884575f80fd5b61588c615452565b8251815260208084015161589f81615398565b828201526040840151838111156158b4575f80fd5b80850194505087601f8501126158c8575f80fd5b835192506158d861550f846154cc565b83815288828587010111156158eb575f80fd5b6158fa848383018488016151f7565b8060408401525081955061590f81880161583f565b9450505050509250929050565b81810381811115610e5557610e556156cd565b5f808335601e19843603018112615944575f80fd5b8301803591506001600160401b0382111561595d575f80fd5b602001915036819003821315613968575f80fd5b5f8851615982818460208d016151f7565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146159fd576159fd6156cd565b505092915050565b5f8235603e19833603018112615434575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a57575f80fd5b615a5f61547a565b615a688361500f565b81526020808401356001600160401b0380821115615a84575f80fd5b9085019036601f830112615a96575f80fd5b813581811115615aa857615aa861543e565b8060051b9150615ab984830161549c565b8181529183018401918481019036841115615ad2575f80fd5b938501935b83851015615afc5784359250615aec83615398565b8282529385019390850190615ad7565b94860194909452509295945050505050565b5f60208284031215615b1e575f80fd5b61166182615153565b5f60208284031215615b37575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b0380831681810361570c5761570c6156cd565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615ba881602a850160208b016151f7565b865190830190615bbf81602a840160208b016151f7565b60c087901b6001600160c01b031916602a9290910191820152615bf1603282018660e01b6001600160e01b0319169052565b615c0a603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c2d8184602088016151f7565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c638184602089016151f7565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615c9e8184602088016151f7565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615eb7380380615eb783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d6a8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004615021565b610615565b005b348015610221575f80fd5b5061021461023036600461505c565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004615021565b610858565b34801561028a575f80fd5b50610214610299366004615073565b610863565b3480156102a9575f80fd5b506102146102b83660046150c1565b610d8d565b3480156102c8575f80fd5b506102dc6102d736600461505c565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004615021565b610e5b565b348015610378575f80fd5b506102146103873660046150e2565b610e66565b348015610397575f80fd5b506102146103a63660046150fb565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004615139565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b36600461505c565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004615021565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b5061021461048036600461505c565b611208565b348015610490575f80fd5b5061021461049f3660046150fb565b6112d3565b3480156104af575f80fd5b506102146104be3660046150e2565b6114ab565b6103f36104d1366004615163565b611634565b3480156104e1575f80fd5b506103f35f80516020615cbe83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a36600461505c565b611668565b34801561053a575f80fd5b506103f35f80516020615cde83398151915281565b34801561055a575f80fd5b5061021461056936600461505c565b611851565b348015610579575f80fd5b506102146105883660046151b7565b61198e565b6103f361059b36600461505c565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce36600461505c565b611a9c565b6040516102579190615243565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f36106103660046152c3565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d3e8339815191526020526040808220815160e0810190925280545f80516020615cde83398151915293929190829060ff166005811115610697576106976151ce565b60058111156106a8576106a86151ce565b81526020016001820180546106bc9061532e565b80601f01602080910402602001604051908101604052809291908181526020018280546106e89061532e565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6151ce565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615360565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f97565b6040518263ffffffff1660e01b8152600401610812919061536e565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615380565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615cde8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615380565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016153ab565b6001600160a01b0316146109995761097460608401604085016153ab565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856153c6565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886153c6565b8363ffffffff168181106109e0576109e061540b565b90506020028101906109f2919061541f565b6109fb90615543565b80516040519192505f916008880191610a13916155bc565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161536e565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c916155bc565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615380565b90508086600801835f0151604051610ae291906155bc565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646151ce565b021790555060208201516001820190610b7d9082615611565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c229116856156e0565b8251604051919550610c33916155bc565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c88906156f3565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615715565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fe6565b604001516120fc565b90505f610cf787612289565b90505f600282604051610d0a91906155bc565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615380565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612463565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd76151ce565b14610df7578060405163170cc93360e21b815260040161063c9190615360565b610852838361249e565b5f805f80516020615cbe83398151915260030154610e1f908461572c565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612718565b610e6e612904565b5f80516020615cbe8339815191525f80610e878461293b565b91509150610e9482612463565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece6151ce565b03610ef3575f83815260088501602052604081208054919055610ef18282612c79565b505b610f0981610f048460400151611192565b612cd7565b505050505b610f2460015f80516020615d1e83398151915255565b50565b5f8181525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe83398151915293929190829060ff166003811115610f7457610f746151ce565b6003811115610f8557610f856151ce565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b9050600183516003811115611012576110126151ce565b14611033578251604051633b0d540d60e21b815261063c919060040161574b565b600481516005811115611048576110486151ce565b0361105e5761105685612cfd565b505050505050565b5f8061107561106c89611fe6565b60400151612f51565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b038416615715565b5f6111d382611a9c565b6080015192915050565b6111e8838383612718565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615cbe8339815191525f61122083611a9c565b5190506004816005811115611237576112376151ce565b14611257578060405163170cc93360e21b815260040161063c9190615360565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c79565b6112db612904565b5f8181525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe83398151915293929190829060ff166003811115611328576113286151ce565b6003811115611339576113396151ce565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b26151ce565b146113d3578051604051633b0d540d60e21b815261063c919060040161574b565b60046113e28260400151611a9c565b5160058111156113f4576113f46151ce565b14611486575f61140385611fe6565b90505f806114148360400151612f51565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612cfd565b50506114a760015f80516020615d1e83398151915255565b5050565b5f80516020615cde8339815191525f806114d06114c785611fe6565b604001516131a7565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546115109061532e565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a6151ce565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615360565b5f82815260068401602052604081206115a591614f75565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d612904565b61164984848434613363565b905061166160015f80516020615d1e83398151915255565b9392505050565b5f8181525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe83398151915293929190829060ff1660038111156116b5576116b56151ce565b60038111156116c6576116c66151ce565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f6151ce565b14158015611760575060038151600381111561175d5761175d6151ce565b14155b15611781578051604051633b0d540d60e21b815261063c919060040161574b565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151611f97565b6040518263ffffffff1660e01b815260040161180a919061536e565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615380565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615cde83398151915291906118989061532e565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e26151ce565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615360565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e9190600401615765565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615380565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f83613531565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a74612904565b611a7f823334613542565b9050611a9760015f80516020615d1e83398151915255565b919050565b611aa4614fac565b5f8281525f80516020615d3e833981519152602052604090819020815160e0810190925280545f80516020615cde833981519152929190829060ff166005811115611af157611af16151ce565b6005811115611b0257611b026151ce565b8152602001600182018054611b169061532e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b429061532e565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615cde833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e90869086906157ef565b90815260200160405180910390205491505092915050565b5f8381525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe8339815191529284929091829060ff166003811115611c9457611c946151ce565b6003811115611ca557611ca56151ce565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d326151ce565b14611d53578251604051633b0d540d60e21b815261063c919060040161574b565b60208301516001600160a01b03163314611def575f8281526005850160205260409020546001600160a01b03163314611d8c5733611278565b5f82815260058501602052604090205460a0820151611dbb91600160b01b90046001600160401b0316906157fe565b6001600160401b0316421015611def5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0457611e046151ce565b03611f325760028401546080840151611e26916001600160401b0316906157fe565b6001600160401b0316421015611e5a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e6c57611e6a828761249e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ea5918491611ea0919061581e565b613817565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee68461396e565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611f4757611f476151ce565b03611f7b57611f558361396e565b5f898152600786016020526040902055611f6e88612cfd565b6001945050505050611661565b805160405163170cc93360e21b815261063c9190600401615360565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561204a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120719190810190615849565b915091508061209357604051636b2f19e960e01b815260040160405180910390fd5b8151156120b9578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120f5576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213157815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b60028110156121805761214881600161591b565b612153906008615715565b61ffff168482815181106121695761216961540b565b016020015160f81c901b9190911790600101612134565b5061ffff8116156121aa5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612205576121c181600361591b565b6121cc906008615715565b63ffffffff16856121de8360026156e0565b815181106121ee576121ee61540b565b016020015160f81c901b91909117906001016121ad565b5063ffffffff81161561222b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122805761224281601f61591b565b61224d906008615715565b866122598360066156e0565b815181106122695761226961540b565b016020015160f81c901b919091179060010161222e565b50949350505050565b60605f808335602085013560146122a5878701604089016153ab565b6122b260608901896153c6565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61233860608501856153c6565b90508110156120f5578161234f60608601866153c6565b8381811061235f5761235f61540b565b9050602002810190612371919061541f565b61237b908061592e565b905061238a60608701876153c6565b8481811061239a5761239a61540b565b90506020028101906123ac919061541f565b6123b6908061592e565b6123c360608901896153c6565b868181106123d3576123d361540b565b90506020028101906123e5919061541f565b6123f390602081019061592e565b61240060608b018b6153c6565b888181106124105761241061540b565b9050602002810190612422919061541f565b612433906060810190604001615139565b6040516020016124499796959493929190615970565b60408051601f19818403018152919052915060010161232b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125109190810190615849565b915091508061253257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612575573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125999190615380565b8251146125bf578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125fb576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f8061260a8460400151613b0b565b915091508187146126315760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615cbe833981519152906001600160401b0390811690831611156126ee575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261270d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615cbe8339815191528161273186613cfc565b905061273c86612463565b61274b57600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127705733611278565b5f86815260058301602052604090205460a082015161279f91600160b01b90046001600160401b0316906157fe565b6001600160401b03168160c001516001600160401b031610156127e65760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127fe576127f7878661249e565b905061281c565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061284190611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156128aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ce9190615380565b905080846008015f8a81526020019081526020015f205f8282546128f291906156e0565b90915550501515979650505050505050565b5f80516020615d1e83398151915280546001190161293557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612944614fac565b5f80516020615cde8339815191525f806129606114c787611fe6565b91509150801561298757604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156129b8576129b86151ce565b60058111156129c9576129c96151ce565b81526020016001820180546129dd9061532e565b80601f0160208091040260200160405190810160405280929190818152602001828054612a099061532e565b8015612a545780601f10612a2b57610100808354040283529160200191612a54565b820191905f5260205f20905b815481529060010190602001808311612a3757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612abf57612abf6151ce565b14158015612ae05750600181516005811115612add57612add6151ce565b14155b15612b0157805160405163170cc93360e21b815261063c9190600401615360565b600381516005811115612b1657612b166151ce565b03612b245760048152612b29565b600581525b836008018160200151604051612b3f91906155bc565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b8357612b836151ce565b021790555060208201516001820190612b9c9082615611565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612c4257612c426151ce565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612cc5575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613fe0565b60015f80516020615d1e83398151915255565b5f8181525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe83398151915293929190829060ff166003811115612d4a57612d4a6151ce565b6003811115612d5b57612d5b6151ce565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612df87fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b8260800151612e0791906157fe565b6001600160401b0316421015612e3b5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b5f848152600684016020908152604080832080546001600160a81b03191681556001810184905560020183905560078601909152812080549082905590808215612ef6575f84815260058701602052604090205461271090612ea890600160a01b900461ffff1685615715565b612eb2919061572c565b915081866008015f8681526020019081526020015f205f828254612ed691906156e0565b90915550612ee69050828461591b565b9050612ef6856020015182612c79565b612f0b8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f8857835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612fd757612f9f81600161591b565b612faa906008615715565b61ffff16868281518110612fc057612fc061540b565b016020015160f81c901b9190911790600101612f8b565b5061ffff8116156130015760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561305c5761301881600361591b565b613023906008615715565b63ffffffff16876130358360026156e0565b815181106130455761304561540b565b016020015160f81c901b9190911790600101613004565b5063ffffffff811660031461308457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130d95761309b81601f61591b565b6130a6906008615715565b886130b28360066156e0565b815181106130c2576130c261540b565b016020015160f81c901b9190911790600101613087565b505f805b6008811015613138576130f181600761591b565b6130fc906008615715565b6001600160401b0316896131118360266156e0565b815181106131215761312161540b565b016020015160f81c901b91909117906001016130dd565b505f805b60088110156131975761315081600761591b565b61315b906008615715565b6001600160401b03168a61317083602e6156e0565b815181106131805761318061540b565b016020015160f81c901b919091179060010161313c565b5091989097509095509350505050565b5f8082516027146131dd57825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561322c576131f481600161591b565b6131ff906008615715565b61ffff168582815181106132155761321561540b565b016020015160f81c901b91909117906001016131e0565b5061ffff8116156132565760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156132b15761326d81600361591b565b613278906008615715565b63ffffffff168661328a8360026156e0565b8151811061329a5761329a61540b565b016020015160f81c901b9190911790600101613259565b5063ffffffff81166002146132d957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561332e576132f081601f61591b565b6132fb906008615715565b876133078360066156e0565b815181106133175761331761540b565b016020015160f81c901b91909117906001016132dc565b505f866026815181106133435761334361540b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615cbe83398151915290600160401b900461ffff90811690861610806133b7575061271061ffff8616115b156133db57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613417576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806134295750806001015483115b1561344a5760405163222d164360e21b81526004810184905260240161063c565b825f61345582610e01565b90505f6134628983614073565b905060405180608001604052806134763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6135396145eb565b610f2481614636565b5f5f80516020615cbe8339815191528161355b84610e01565b90505f61356787611a9c565b905061357287612463565b613592576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156135a7576135a76151ce565b146135c857805160405163170cc93360e21b815261063c9190600401615360565b5f8282608001516135d991906157fe565b905083600201600a9054906101000a90046001600160401b0316826040015161360291906159d9565b6001600160401b0316816001600160401b0316111561363f57604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061364b8a84613817565b915091505f8a8360405160200161367992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561370c5761370c6151ce565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d3e833981519152602052604081206002015481905f80516020615cde83398151915290600160801b90046001600160401b031661385f85826146aa565b5f613869876148cd565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6138b98a858b611f97565b6040518263ffffffff1660e01b81526004016138d5919061536e565b6020604051808303815f875af11580156138f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139159190615380565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615cbe83398151915290505f61398e8460400151611a9c565b90505f6003825160058111156139a6576139a66151ce565b14806139c457506004825160058111156139c2576139c26151ce565b145b156139d4575060c0810151613a11565b6002825160058111156139e9576139e96151ce565b036139f5575042613a11565b815160405163170cc93360e21b815261063c9190600401615360565b84608001516001600160401b0316816001600160401b031611613a3857505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613a5d90611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613ade573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b029190615380565b95945050505050565b5f808251602e14613b4157825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b9057613b5881600161591b565b613b63906008615715565b61ffff16858281518110613b7957613b7961540b565b016020015160f81c901b9190911790600101613b44565b5061ffff811615613bba5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613c1557613bd181600361591b565b613bdc906008615715565b63ffffffff1686613bee8360026156e0565b81518110613bfe57613bfe61540b565b016020015160f81c901b9190911790600101613bbd565b5063ffffffff811615613c3b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c9057613c5281601f61591b565b613c5d906008615715565b87613c698360066156e0565b81518110613c7957613c7961540b565b016020015160f81c901b9190911790600101613c3e565b505f805b6008811015613cef57613ca881600761591b565b613cb3906008615715565b6001600160401b031688613cc88360266156e0565b81518110613cd857613cd861540b565b016020015160f81c901b9190911790600101613c94565b5090969095509350505050565b613d04614fac565b5f8281525f80516020615d3e8339815191526020526040808220815160e0810190925280545f80516020615cde83398151915293929190829060ff166005811115613d5157613d516151ce565b6005811115613d6257613d626151ce565b8152602001600182018054613d769061532e565b80601f0160208091040260200160405190810160405280929190818152602001828054613da29061532e565b8015613ded5780601f10613dc457610100808354040283529160200191613ded565b820191905f5260205f20905b815481529060010190602001808311613dd057829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613e5b57613e5b6151ce565b14613e8e575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615360565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ed257613ed26151ce565b021790555060208201516001820190613eeb9082615611565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f898582613817565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156140035760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461404c576040519150601f19603f3d011682016040523d82523d5f602084013e614051565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140b757604051637fab81e560e01b815260040160405180910390fd5b5f80516020615cde833981519152426140d66060860160408701615139565b6001600160401b031611158061411057506140f46202a300426156e0565b6141046060860160408701615139565b6001600160401b031610155b1561414a576141256060850160408601615139565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61415f61415a6060860186615a04565b614942565b61416f61415a6080860186615a04565b603061417e602086018661592e565b9050146141b057614192602085018561592e565b6040516326475b2f60e11b815261063c925060040190815260200190565b6141ba848061592e565b90505f036141e7576141cc848061592e565b604051633e08a12560e11b815260040161063c929190615a18565b5f600882016141f6868061592e565b6040516142049291906157ef565b9081526020016040518091039020541461423d57614222848061592e565b60405163a41f772f60e01b815260040161063c929190615a18565b614247835f6146aa565b6040805160e08101909152815481525f908190614353906020810161426c898061592e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906142b4908a018a61592e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016142fd60608a0160408b01615139565b6001600160401b0316815260200161431860608a018a615a04565b61432190615a46565b815260200161433360808a018a615a04565b61433c90615a46565b8152602001876001600160401b0316815250614aab565b5f828152600686016020526040902091935091506143718282615611565b508160088401614381888061592e565b60405161438f9291906157ef565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143cb90859060040161536e565b6020604051808303815f875af11580156143e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061440b9190615380565b6040805160e08101909152909150806001815260200161442b898061592e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156144ba576144ba6151ce565b0217905550602082015160018201906144d39082615611565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580614571888061592e565b60405161457f9291906157ef565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145bd9190615139565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661463457604051631afcd79f60e31b815260040160405180910390fd5b565b61463e6145eb565b61464781614c98565b61464f614cb1565b610f246060820135608083013561466c60c0850160a08601615139565b61467c60e0860160c08701615b0d565b61468d610100870160e08801615b26565b6101008701356146a561014089016101208a016153ab565b614cc1565b5f80516020615cde8339815191525f6001600160401b0380841690851611156146de576146d7838561581e565b90506146eb565b6146e8848461581e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061474d575060018401548151614749916001600160401b0316906156e0565b8210155b15614773576001600160401b038316606082015281815260408101516020820152614792565b828160600181815161478591906157fe565b6001600160401b03169052505b60608101516147a29060646159d9565b602082015160018601546001600160401b0392909216916147cd9190600160401b900460ff16615715565b10156147fd57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161481891906156e0565b9052506040810180516001600160401b038716919061483890839061591b565b9052506001840154604082015160649161485d91600160401b90910460ff1690615715565b1015614884578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d3e8339815191526020526040812060020180545f80516020615cde833981519152919060089061491790600160401b90046001600160401b0316615b46565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61494f60208201826150e2565b63ffffffff1615801561496f575061496a60208201826153c6565b151590505b156149b65761498160208201826150e2565b61498e60208301836153c6565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149c360208201826153c6565b90506149d260208301836150e2565b63ffffffff1611156149eb5761498160208201826150e2565b60015b6149fb60208301836153c6565b90508110156114a757614a1160208301836153c6565b614a1c60018461591b565b818110614a2b57614a2b61540b565b9050602002016020810190614a4091906153ab565b6001600160a01b0316614a5660208401846153c6565b83818110614a6657614a6661540b565b9050602002016020810190614a7b91906153ab565b6001600160a01b03161015614aa357604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149ee565b5f6060826040015151603014614ad45760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b15988a986001989297929690959094909390929101615b61565b60405160208183030381529060405290505f5b84608001516020015151811015614b8757818560800151602001518281518110614b5457614b5461540b565b6020026020010151604051602001614b6d929190615c1b565b60408051601f198184030181529190529150600101614b28565b5060a0840151805160209182015151604051614ba7938593929101615c51565b60405160208183030381529060405290505f5b8460a001516020015151811015614c1957818560a00151602001518281518110614be657614be661540b565b6020026020010151604051602001614bff929190615c1b565b60408051601f198184030181529190529150600101614bba565b5060c0840151604051614c30918391602001615c8c565b6040516020818303038152906040529050600281604051614c5191906155bc565b602060405180830381855afa158015614c6c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c8f9190615380565b94909350915050565b614ca06145eb565b614ca8614e7d565b610f2481614e85565b614cb96145eb565b614634614f6d565b614cc96145eb565b5f80516020615cbe83398151915261ffff85161580614ced575061271061ffff8616115b15614d1157604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614d355760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614d485750600a60ff8516115b15614d6b5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614dd2576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614df25760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6146346145eb565b614e8d6145eb565b80355f80516020615cde8339815191529081556014614eb26060840160408501615b26565b60ff161180614ed15750614ecc6060830160408401615b26565b60ff16155b15614f0557614ee66060830160408401615b26565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614f156060830160408401615b26565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f466040830160208401615139565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612cea6145eb565b508054614f819061532e565b5f825580601f10614f90575050565b601f0160209004905f5260205f2090810190610f249190614fe9565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ffd575f8155600101614fea565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215615033575f80fd5b83359250602084013561504581615001565b91506150536040850161500e565b90509250925092565b5f6020828403121561506c575f80fd5b5035919050565b5f8060408385031215615084575f80fd5b82356001600160401b03811115615099575f80fd5b8301608081860312156150aa575f80fd5b91506150b86020840161500e565b90509250929050565b5f80604083850312156150d2575f80fd5b823591506150b86020840161500e565b5f602082840312156150f2575f80fd5b6116618261500e565b5f806040838503121561510c575f80fd5b6151158361500e565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f60208284031215615149575f80fd5b61166182615123565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615175575f80fd5b83356001600160401b0381111561518a575f80fd5b840160a0818703121561519b575f80fd5b92506151a960208501615152565b915061505360408501615123565b5f61014082840312156151c8575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106151f2576151f26151ce565b9052565b5f5b838110156152105781810151838201526020016151f8565b50505f910152565b5f815180845261522f8160208601602086016151f6565b601f01601f19169290920160200192915050565b602081526152556020820183516151e2565b5f602083015160e06040840152615270610100840182615218565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156152d4575f80fd5b82356001600160401b03808211156152ea575f80fd5b818501915085601f8301126152fd575f80fd5b81358181111561530b575f80fd5b86602082850101111561531c575f80fd5b60209290920196919550909350505050565b600181811c9082168061534257607f821691505b6020821081036151c857634e487b7160e01b5f52602260045260245ffd5b60208101610e5582846151e2565b602081525f6116616020830184615218565b5f60208284031215615390575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f602082840312156153bb575f80fd5b813561166181615397565b5f808335601e198436030181126153db575f80fd5b8301803591506001600160401b038211156153f4575f80fd5b6020019150600581901b3603821315613967575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615433575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154735761547361543d565b60405290565b604080519081016001600160401b03811182821017156154735761547361543d565b604051601f8201601f191681016001600160401b03811182821017156154c3576154c361543d565b604052919050565b5f6001600160401b038211156154e3576154e361543d565b50601f01601f191660200190565b5f82601f830112615500575f80fd5b813561551361550e826154cb565b61549b565b818152846020838601011115615527575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615553575f80fd5b61555b615451565b82356001600160401b0380821115615571575f80fd5b61557d368387016154f1565b83526020850135915080821115615592575f80fd5b5061559f368286016154f1565b6020830152506155b160408401615123565b604082015292915050565b5f82516154338184602087016151f6565b601f82111561064557805f5260205f20601f840160051c810160208510156155f25750805b601f840160051c820191505b8181101561184a575f81556001016155fe565b81516001600160401b0381111561562a5761562a61543d565b61563e81615638845461532e565b846155cd565b602080601f831160018114615671575f841561565a5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b8281101561569f57888601518255948401946001909101908401615680565b50858210156156bc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e556156cc565b5f63ffffffff80831681810361570b5761570b6156cc565b6001019392505050565b8082028115828204841417610e5557610e556156cc565b5f8261574657634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061575f5761575f6151ce565b91905290565b5f60208083525f84546157778161532e565b806020870152604060018084165f811461579857600181146157b4576157e1565b60ff19851660408a0152604084151560051b8a010195506157e1565b895f5260205f205f5b858110156157d85781548b82018601529083019088016157bd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120f5576120f56156cc565b6001600160401b038281168282160390808211156120f5576120f56156cc565b8051611a9781615001565b5f806040838503121561585a575f80fd5b82516001600160401b0380821115615870575f80fd5b9084019060608287031215615883575f80fd5b61588b615451565b8251815260208084015161589e81615397565b828201526040840151838111156158b3575f80fd5b80850194505087601f8501126158c7575f80fd5b835192506158d761550e846154cb565b83815288828587010111156158ea575f80fd5b6158f9848383018488016151f6565b8060408401525081955061590e81880161583e565b9450505050509250929050565b81810381811115610e5557610e556156cc565b5f808335601e19843603018112615943575f80fd5b8301803591506001600160401b0382111561595c575f80fd5b602001915036819003821315613967575f80fd5b5f8851615981818460208d016151f6565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146159fc576159fc6156cc565b505092915050565b5f8235603e19833603018112615433575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a56575f80fd5b615a5e615479565b615a678361500e565b81526020808401356001600160401b0380821115615a83575f80fd5b9085019036601f830112615a95575f80fd5b813581811115615aa757615aa761543d565b8060051b9150615ab884830161549b565b8181529183018401918481019036841115615ad1575f80fd5b938501935b83851015615afb5784359250615aeb83615397565b8282529385019390850190615ad6565b94860194909452509295945050505050565b5f60208284031215615b1d575f80fd5b61166182615152565b5f60208284031215615b36575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b0380831681810361570b5761570b6156cc565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615ba781602a850160208b016151f6565b865190830190615bbe81602a840160208b016151f6565b60c087901b6001600160c01b031916602a9290910191820152615bf0603282018660e01b6001600160e01b0319169052565b615c09603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c2c8184602088016151f6565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c628184602089016151f6565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615c9d8184602088016151f6565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index ccf657946..eacff333a 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -599,12 +599,6 @@ abstract contract PoSValidatorManager is }); return (reward > 0); } else if (validator.status == ValidatorStatus.Completed) { - // To prevent churn tracker abuse, check that one full churn period has passed, - // so a delegator may not stake twice in the same churn period. - if (block.timestamp < delegator.startedAt + _getChurnPeriodSeconds()) { - revert MinStakeDurationNotPassed(uint64(block.timestamp)); - } - $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); _completeEndDelegation(delegationID); @@ -725,6 +719,12 @@ abstract contract PoSValidatorManager is Delegator memory delegator = $._delegatorStakes[delegationID]; bytes32 validationID = delegator.validationID; + // To prevent churn tracker abuse, check that one full churn period has passed, + // so a delegator may not stake twice in the same churn period. + if (block.timestamp < delegator.startedAt + _getChurnPeriodSeconds()) { + revert MinStakeDurationNotPassed(uint64(block.timestamp)); + } + // Once this function completes, the delegation is completed so we can clear it from state now. delete $._delegatorStakes[delegationID]; diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index eb5634a11..1684e165d 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -460,7 +460,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } - function testInitializeEndDelegationChurnPeriodSecondsNotPassed() public { + function testCompleteEndDelegationChurnPeriodSecondsNotPassed() public { bytes32 validationID = _registerDefaultValidator(); uint64 delegatorRegistrationTime = DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION + 1; @@ -484,11 +484,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); uint64 invalidEndTime = delegatorRegistrationTime + DEFAULT_CHURN_PERIOD - 1; + vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.MinStakeDurationNotPassed.selector, invalidEndTime ) ); + + // Initialize end delegation will also call _completeEndDelegation because the validator is copmleted. _initializeEndDelegation({ sender: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index 783a898f2..fd5647981 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -76,7 +76,7 @@ export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego cd $TELEPORTER_PATH if command -v forge &> /dev/null; then - forge build --skip test + forge build --skip test --optimizer-runs 100 else echo "Forge command not found, attempting to use from $HOME" $HOME/.foundry/bin/forge build From b073608d7d49dbda97fb853a2fd8d9c8bdb890f4 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 24 Oct 2024 12:51:56 -0400 Subject: [PATCH 30/35] Try 0 optimizer runs --- scripts/local/e2e_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index fd5647981..a24a722a4 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -76,7 +76,7 @@ export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego cd $TELEPORTER_PATH if command -v forge &> /dev/null; then - forge build --skip test --optimizer-runs 100 + forge build --skip test --optimizer-runs 0 else echo "Forge command not found, attempting to use from $HOME" $HOME/.foundry/bin/forge build From a58fba7b31c6380d58e6a23f332b3f560d3c2bda Mon Sep 17 00:00:00 2001 From: Michael Kaplan Date: Thu, 24 Oct 2024 14:19:53 -0400 Subject: [PATCH 31/35] 100 optimizer runs for ABI bindings --- .../go/governance/ValidatorSetSig/ValidatorSetSig.go | 2 +- abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go | 2 +- .../teleporter/TeleporterMessenger/TeleporterMessenger.go | 2 +- .../registry/TeleporterRegistry/TeleporterRegistry.go | 2 +- .../go/teleporter/tests/TestMessenger/TestMessenger.go | 2 +- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../ExampleRewardCalculator/ExampleRewardCalculator.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- scripts/abi_bindings.sh | 2 +- scripts/local/e2e_test.sh | 8 -------- 11 files changed, 10 insertions(+), 18 deletions(-) diff --git a/abi-bindings/go/governance/ValidatorSetSig/ValidatorSetSig.go b/abi-bindings/go/governance/ValidatorSetSig/ValidatorSetSig.go index e330c6c51..59ff01e96 100644 --- a/abi-bindings/go/governance/ValidatorSetSig/ValidatorSetSig.go +++ b/abi-bindings/go/governance/ValidatorSetSig/ValidatorSetSig.go @@ -42,7 +42,7 @@ type ValidatorSetSigMessage struct { // ValidatorSetSigMetaData contains all meta data concerning the ValidatorSetSig contract. var ValidatorSetSigMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"validatorBlockchainID_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"VALIDATORS_SOURCE_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blockchainID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"executeCall\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"targetContractAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validateMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structValidatorSetSigMessage\",\"components\":[{\"name\":\"targetBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorSetSigAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"targetContractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorBlockchainID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Delivered\",\"inputs\":[{\"name\":\"targetContractAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x60c060405234801561000f575f80fd5b50604051610b4d380380610b4d83398101604081905261002e916100b2565b60015f5560808190526040805163084279ef60e31b8152905173020000000000000000000000000000000000000591634213cf789160048083019260209291908290030181865afa158015610085573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a991906100b2565b60a052506100c9565b5f602082840312156100c2575f80fd5b5051919050565b60805160a051610a556100f85f395f818161017701526104ba01525f818161012a01526102790152610a555ff3fe608060405260043610610071575f3560e01c80637ecebe001161004c5780637ecebe00146100e05780638d6e579d14610119578063b771b3bc1461014c578063d127dc9b14610166575f80fd5b80630731775d1461007c5780635433da42146100ac5780637d969c34146100c1575f80fd5b3661007857005b5f80fd5b348015610087575f80fd5b5061008f5f81565b6040516001600160a01b0390911681526020015b60405180910390f35b6100bf6100ba366004610642565b610199565b005b3480156100cc575f80fd5b506100bf6100db36600461079a565b6104b6565b3480156100eb575f80fd5b5061010b6100fa366004610842565b60016020525f908152604090205481565b6040519081526020016100a3565b348015610124575f80fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610157575f80fd5b5061008f6005600160991b0181565b348015610171575f80fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b6101a161061a565b6040516306f8253560e41b815263ffffffff821660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156101ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261021191908101906108c9565b91509150806102755760405162461bcd60e51b815260206004820152602560248201527f56616c696461746f725365745369673a20696e76616c69642077617270206d65604482015264737361676560d81b60648201526084015b60405180910390fd5b81517f0000000000000000000000000000000000000000000000000000000000000000146102f45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f725365745369673a20696e76616c696420736f75726365436044820152651a185a5b925160d21b606482015260840161026c565b60208201516001600160a01b0316156103655760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f725365745369673a206e6f6e2d7a65726f206f726967696e60448201526c53656e6465724164647265737360981b606482015260840161026c565b5f826040015180602001905181019061037e9190610969565b9050610389816104b6565b6060810151610399906001610a08565b604080830180516001600160a01b039081165f9081526001602052838120949094559051608085015160a0860151935191909216926103d791610a2d565b5f6040518083038185875af1925050503d805f8114610411576040519150601f19603f3d011682016040523d82523d5f602084013e610416565b606091505b50509050806104675760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f725365745369673a2063616c6c206661696c656400000000604482015260640161026c565b816060015182604001516001600160a01b03167f5942a9a3968c7d49fc51c027041544ea295f5c1e395d6d8aa35c4369959f8ed960405160405180910390a3505050506104b360015f55565b50565b80517f00000000000000000000000000000000000000000000000000000000000000001461053a5760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f725365745369673a20696e76616c6964207461726765744260448201526a1b1bd8dad8da185a5b925160aa1b606482015260840161026c565b60208101516001600160a01b031630146105ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f725365745369673a20696e76616c69642076616c6964617460448201526e6f725365745369674164647265737360881b606482015260840161026c565b60608101516040808301516001600160a01b03165f90815260016020522054146104b35760405162461bcd60e51b815260206004820152601e60248201527f56616c696461746f725365745369673a20696e76616c6964206e6f6e63650000604482015260640161026c565b60025f540361063c57604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b5f60208284031215610652575f80fd5b813563ffffffff81168114610665575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c0810167ffffffffffffffff811182821017156106a3576106a361066c565b60405290565b6040516060810167ffffffffffffffff811182821017156106a3576106a361066c565b604051601f8201601f1916810167ffffffffffffffff811182821017156106f5576106f561066c565b604052919050565b6001600160a01b03811681146104b3575f80fd5b803561071c816106fd565b919050565b5f67ffffffffffffffff82111561073a5761073a61066c565b50601f01601f191660200190565b5f82601f830112610757575f80fd5b813561076a61076582610721565b6106cc565b81815284602083860101111561077e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156107aa575f80fd5b813567ffffffffffffffff808211156107c1575f80fd5b9083019060c082860312156107d4575f80fd5b6107dc610680565b823581526107ec60208401610711565b60208201526107fd60408401610711565b6040820152606083013560608201526080830135608082015260a083013582811115610827575f80fd5b61083387828601610748565b60a08301525095945050505050565b5f60208284031215610852575f80fd5b8135610665816106fd565b5f5b8381101561087757818101518382015260200161085f565b50505f910152565b5f82601f83011261088e575f80fd5b815161089c61076582610721565b8181528460208386010111156108b0575f80fd5b6108c182602083016020870161085d565b949350505050565b5f80604083850312156108da575f80fd5b825167ffffffffffffffff808211156108f1575f80fd5b9084019060608287031215610904575f80fd5b61090c6106a9565b82518152602083015161091e816106fd565b6020820152604083015182811115610934575f80fd5b6109408882860161087f565b6040830152508094505050506020830151801515811461095e575f80fd5b809150509250929050565b5f60208284031215610979575f80fd5b815167ffffffffffffffff80821115610990575f80fd5b9083019060c082860312156109a3575f80fd5b6109ab610680565b8251815260208301516109bd816106fd565b602082015260408301516109d0816106fd565b80604083015250606083015160608201526080830151608082015260a0830151828111156109fc575f80fd5b6108338782860161087f565b80820180821115610a2757634e487b7160e01b5f52601160045260245ffd5b92915050565b5f8251610a3e81846020870161085d565b919091019291505056fea164736f6c6343000819000a", + Bin: "0x60c060405234801561000f575f80fd5b50604051610b37380380610b3783398101604081905261002e916100b2565b60015f5560808190526040805163084279ef60e31b8152905173020000000000000000000000000000000000000591634213cf789160048083019260209291908290030181865afa158015610085573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a991906100b2565b60a052506100c9565b5f602082840312156100c2575f80fd5b5051919050565b60805160a051610a3f6100f85f395f818161016801526104ab01525f818161011b015261026a0152610a3f5ff3fe608060405260043610610062575f3560e01c80630731775d1461006d5780635433da421461009d5780637d969c34146100b25780637ecebe00146100d15780638d6e579d1461010a578063b771b3bc1461013d578063d127dc9b14610157575f80fd5b3661006957005b5f80fd5b348015610078575f80fd5b506100805f81565b6040516001600160a01b0390911681526020015b60405180910390f35b6100b06100ab366004610633565b61018a565b005b3480156100bd575f80fd5b506100b06100cc366004610787565b6104a7565b3480156100dc575f80fd5b506100fc6100eb36600461082e565b60016020525f908152604090205481565b604051908152602001610094565b348015610115575f80fd5b506100fc7f000000000000000000000000000000000000000000000000000000000000000081565b348015610148575f80fd5b506100806005600160991b0181565b348015610162575f80fd5b506100fc7f000000000000000000000000000000000000000000000000000000000000000081565b61019261060b565b6040516306f8253560e41b815263ffffffff821660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156101db573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261020291908101906108b5565b91509150806102665760405162461bcd60e51b815260206004820152602560248201527f56616c696461746f725365745369673a20696e76616c69642077617270206d65604482015264737361676560d81b60648201526084015b60405180910390fd5b81517f0000000000000000000000000000000000000000000000000000000000000000146102e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f725365745369673a20696e76616c696420736f75726365436044820152651a185a5b925160d21b606482015260840161025d565b60208201516001600160a01b0316156103565760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f725365745369673a206e6f6e2d7a65726f206f726967696e60448201526c53656e6465724164647265737360981b606482015260840161025d565b5f826040015180602001905181019061036f9190610954565b905061037a816104a7565b606081015161038a9060016109f2565b604080830180516001600160a01b039081165f9081526001602052838120949094559051608085015160a0860151935191909216926103c891610a17565b5f6040518083038185875af1925050503d805f8114610402576040519150601f19603f3d011682016040523d82523d5f602084013e610407565b606091505b50509050806104585760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f725365745369673a2063616c6c206661696c656400000000604482015260640161025d565b816060015182604001516001600160a01b03167f5942a9a3968c7d49fc51c027041544ea295f5c1e395d6d8aa35c4369959f8ed960405160405180910390a3505050506104a460015f55565b50565b80517f00000000000000000000000000000000000000000000000000000000000000001461052b5760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f725365745369673a20696e76616c6964207461726765744260448201526a1b1bd8dad8da185a5b925160aa1b606482015260840161025d565b60208101516001600160a01b0316301461059f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f725365745369673a20696e76616c69642076616c6964617460448201526e6f725365745369674164647265737360881b606482015260840161025d565b60608101516040808301516001600160a01b03165f90815260016020522054146104a45760405162461bcd60e51b815260206004820152601e60248201527f56616c696461746f725365745369673a20696e76616c6964206e6f6e63650000604482015260640161025d565b60025f540361062d57604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b5f60208284031215610643575f80fd5b813563ffffffff81168114610656575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156106935761069361065d565b60405290565b604051606081016001600160401b03811182821017156106935761069361065d565b604051601f8201601f191681016001600160401b03811182821017156106e3576106e361065d565b604052919050565b6001600160a01b03811681146104a4575f80fd5b803561070a816106eb565b919050565b5f6001600160401b038211156107275761072761065d565b50601f01601f191660200190565b5f82601f830112610744575f80fd5b81356107576107528261070f565b6106bb565b81815284602083860101111561076b575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215610797575f80fd5b81356001600160401b03808211156107ad575f80fd5b9083019060c082860312156107c0575f80fd5b6107c8610671565b823581526107d8602084016106ff565b60208201526107e9604084016106ff565b6040820152606083013560608201526080830135608082015260a083013582811115610813575f80fd5b61081f87828601610735565b60a08301525095945050505050565b5f6020828403121561083e575f80fd5b8135610656816106eb565b5f5b8381101561086357818101518382015260200161084b565b50505f910152565b5f82601f83011261087a575f80fd5b81516108886107528261070f565b81815284602083860101111561089c575f80fd5b6108ad826020830160208701610849565b949350505050565b5f80604083850312156108c6575f80fd5b82516001600160401b03808211156108dc575f80fd5b90840190606082870312156108ef575f80fd5b6108f7610699565b825181526020830151610909816106eb565b602082015260408301518281111561091f575f80fd5b61092b8882860161086b565b60408301525080945050505060208301518015158114610949575f80fd5b809150509250929050565b5f60208284031215610964575f80fd5b81516001600160401b038082111561097a575f80fd5b9083019060c0828603121561098d575f80fd5b610995610671565b8251815260208301516109a7816106eb565b602082015260408301516109ba816106eb565b80604083015250606083015160608201526080830151608082015260a0830151828111156109e6575f80fd5b61081f8782860161086b565b80820180821115610a1157634e487b7160e01b5f52601160045260245ffd5b92915050565b5f8251610a28818460208701610849565b919091019291505056fea164736f6c6343000819000a", } // ValidatorSetSigABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go index 2f6a01a04..1b2b5e53a 100644 --- a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go +++ b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go @@ -32,7 +32,7 @@ var ( // ExampleERC20MetaData contains all meta data concerning the ExampleERC20 contract. var ExampleERC20MetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ERC20InsufficientAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InsufficientBalance\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidApprover\",\"inputs\":[{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSpender\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108c28061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e4919061072e565b60405180910390f35b6101006100fb366004610795565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b6101006101303660046107bd565b6102b6565b604051601281526020016100e4565b610157610152366004610795565b6102d9565b005b6101576101673660046107f6565b610344565b61011461017a36600461080d565b6001600160a01b03165f9081526020819052604090205490565b6101576101a2366004610795565b610351565b6100d7610366565b6101576101bd3660046107f6565b610375565b6101006101d0366004610795565b6103d7565b6101146101e336600461082d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c9061085e565b80601f01602080910402602001604051908101604052809291908181526020018280546102489061085e565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa8185856103e4565b60019150505b92915050565b5f336102c38582856103f6565b6102ce858585610471565b506001949350505050565b678ac7230489e800008111156103365760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b61034082826104ce565b5050565b61034e3382610502565b50565b61035c8233836103f6565b6103408282610502565b60606004805461021c9061085e565b678ac7230489e800008111156103cd5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604482015260640161032d565b61034e33826104ce565b5f336102aa818585610471565b6103f18383836001610536565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461046b578181101561045d57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161032d565b61046b84848484035f610536565b50505050565b6001600160a01b03831661049a57604051634b637e8f60e11b81525f600482015260240161032d565b6001600160a01b0382166104c35760405163ec442f0560e01b81525f600482015260240161032d565b6103f1838383610608565b6001600160a01b0382166104f75760405163ec442f0560e01b81525f600482015260240161032d565b6103405f8383610608565b6001600160a01b03821661052b57604051634b637e8f60e11b81525f600482015260240161032d565b610340825f83610608565b6001600160a01b03841661055f5760405163e602df0560e01b81525f600482015260240161032d565b6001600160a01b03831661058857604051634a1406b160e11b81525f600482015260240161032d565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561046b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105fa91815260200190565b60405180910390a350505050565b6001600160a01b038316610632578060025f8282546106279190610896565b909155506106a29050565b6001600160a01b0383165f90815260208190526040902054818110156106845760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161032d565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166106be576002805482900390556106dc565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161072191815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b8181101561075a5785810183015185820160400152820161073e565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610790575f80fd5b919050565b5f80604083850312156107a6575f80fd5b6107af8361077a565b946020939093013593505050565b5f805f606084860312156107cf575f80fd5b6107d88461077a565b92506107e66020850161077a565b9150604084013590509250925092565b5f60208284031215610806575f80fd5b5035919050565b5f6020828403121561081d575f80fd5b6108268261077a565b9392505050565b5f806040838503121561083e575f80fd5b6108478361077a565b91506108556020840161077a565b90509250929050565b600181811c9082168061087257607f821691505b60208210810361089057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b61088a8061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100bc575f3560e01c806342966c681161007957806342966c681461014a57806370a082311461015d57806379cc67901461018557806395d89b4114610198578063a0712d68146101a0578063a9059cbb146101b3578063dd62ed3e146101c6575f80fd5b806306fdde03146100c0578063095ea7b3146100de57806318160ddd1461010157806323b872dd14610113578063313ce5671461012657806340c10f1914610135575b5f80fd5b6100c86101d9565b6040516100d5919061068a565b60405180910390f35b6100f16100ec3660046106f1565b610269565b60405190151581526020016100d5565b6002545b6040519081526020016100d5565b6100f1610121366004610719565b610282565b604051601281526020016100d5565b6101486101433660046106f1565b6102a5565b005b610148610158366004610752565b6102e4565b61010561016b366004610769565b6001600160a01b03165f9081526020819052604090205490565b6101486101933660046106f1565b6102f1565b6100c8610306565b6101486101ae366004610752565b610315565b6100f16101c13660046106f1565b610347565b6101056101d4366004610789565b610354565b6060600380546101e8906107ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610214906107ba565b801561025f5780601f106102365761010080835404028352916020019161025f565b820191905f5260205f20905b81548152906001019060200180831161024257829003601f168201915b5050505050905090565b5f3361027681858561037e565b60019150505b92915050565b5f3361028f858285610390565b61029a8585856103e0565b506001949350505050565b678ac7230489e800008111156102d65760405162461bcd60e51b81526004016102cd906107f2565b60405180910390fd5b6102e0828261043d565b5050565b6102ee3382610471565b50565b6102fc823383610390565b6102e08282610471565b6060600480546101e8906107ba565b678ac7230489e8000081111561033d5760405162461bcd60e51b81526004016102cd906107f2565b6102ee338261043d565b5f336102768185856103e0565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61038b83838360016104a5565b505050565b5f61039b8484610354565b90505f1981146103da57818110156103cc57828183604051637dc7a0d960e11b81526004016102cd93929190610829565b6103da84848484035f6104a5565b50505050565b6001600160a01b038316610409575f604051634b637e8f60e11b81526004016102cd919061084a565b6001600160a01b038216610432575f60405163ec442f0560e01b81526004016102cd919061084a565b61038b838383610577565b6001600160a01b038216610466575f60405163ec442f0560e01b81526004016102cd919061084a565b6102e05f8383610577565b6001600160a01b03821661049a575f604051634b637e8f60e11b81526004016102cd919061084a565b6102e0825f83610577565b6001600160a01b0384166104ce575f60405163e602df0560e01b81526004016102cd919061084a565b6001600160a01b0383166104f7575f604051634a1406b160e11b81526004016102cd919061084a565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156103da57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056991815260200190565b60405180910390a350505050565b6001600160a01b0383166105a1578060025f828254610596919061085e565b909155506105fe9050565b6001600160a01b0383165f90815260208190526040902054818110156105e05783818360405163391434e360e21b81526004016102cd93929190610829565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661061a57600280548290039055610638565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161067d91815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b818110156106b65785810183015185820160400152820161069a565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146106ec575f80fd5b919050565b5f8060408385031215610702575f80fd5b61070b836106d6565b946020939093013593505050565b5f805f6060848603121561072b575f80fd5b610734846106d6565b9250610742602085016106d6565b9150604084013590509250925092565b5f60208284031215610762575f80fd5b5035919050565b5f60208284031215610779575f80fd5b610782826106d6565b9392505050565b5f806040838503121561079a575f80fd5b6107a3836106d6565b91506107b1602084016106d6565b90509250929050565b600181811c908216806107ce57607f821691505b6020821081036107ec57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601f908201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604082015260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b0391909116815260200190565b8082018082111561027c57634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // ExampleERC20ABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/teleporter/TeleporterMessenger/TeleporterMessenger.go b/abi-bindings/go/teleporter/TeleporterMessenger/TeleporterMessenger.go index 805c6ddc4..52fdbce12 100644 --- a/abi-bindings/go/teleporter/TeleporterMessenger/TeleporterMessenger.go +++ b/abi-bindings/go/teleporter/TeleporterMessenger/TeleporterMessenger.go @@ -66,7 +66,7 @@ type TeleporterMessageReceipt struct { // TeleporterMessengerMetaData contains all meta data concerning the TeleporterMessenger contract. var TeleporterMessengerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addFeeAmount\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"additionalFeeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blockchainID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateMessageID\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkRelayerRewardAmount\",\"inputs\":[{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAsset\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeInfo\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMessageHash\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNextMessageID\",\"inputs\":[{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReceiptAtIndex\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTeleporterMessageReceipt\",\"components\":[{\"name\":\"receivedMessageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"relayerRewardAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReceiptQueueSize\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRelayerRewardAddress\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initializeBlockchainID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"messageNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageReceived\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"receiptQueues\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"first\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"last\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"receiveCrossChainMessage\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"relayerRewardAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"receivedFailedMessageHashes\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"redeemRelayerRewards\",\"inputs\":[{\"name\":\"feeAsset\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"retryMessageExecution\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structTeleporterMessage\",\"components\":[{\"name\":\"messageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originSenderAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requiredGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowedRelayerAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"receipts\",\"type\":\"tuple[]\",\"internalType\":\"structTeleporterMessageReceipt[]\",\"components\":[{\"name\":\"receivedMessageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"relayerRewardAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"retrySendCrossChainMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structTeleporterMessage\",\"components\":[{\"name\":\"messageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originSenderAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requiredGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowedRelayerAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"receipts\",\"type\":\"tuple[]\",\"internalType\":\"structTeleporterMessageReceipt[]\",\"components\":[{\"name\":\"receivedMessageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"relayerRewardAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendCrossChainMessage\",\"inputs\":[{\"name\":\"messageInput\",\"type\":\"tuple\",\"internalType\":\"structTeleporterMessageInput\",\"components\":[{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeInfo\",\"type\":\"tuple\",\"internalType\":\"structTeleporterFeeInfo\",\"components\":[{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"requiredGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowedRelayerAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendSpecifiedReceipts\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIDs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"feeInfo\",\"type\":\"tuple\",\"internalType\":\"structTeleporterFeeInfo\",\"components\":[{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"allowedRelayerAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sentMessageInfo\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"feeInfo\",\"type\":\"tuple\",\"internalType\":\"structTeleporterFeeInfo\",\"components\":[{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AddFeeAmount\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"updatedFeeInfo\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTeleporterFeeInfo\",\"components\":[{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockchainIDInitialized\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageExecuted\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageExecutionFailed\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTeleporterMessage\",\"components\":[{\"name\":\"messageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originSenderAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requiredGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowedRelayerAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"receipts\",\"type\":\"tuple[]\",\"internalType\":\"structTeleporterMessageReceipt[]\",\"components\":[{\"name\":\"receivedMessageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"relayerRewardAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceiptReceived\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"relayerRewardAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"feeInfo\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTeleporterFeeInfo\",\"components\":[{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceiveCrossChainMessage\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"deliverer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"rewardRedeemer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTeleporterMessage\",\"components\":[{\"name\":\"messageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originSenderAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requiredGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowedRelayerAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"receipts\",\"type\":\"tuple[]\",\"internalType\":\"structTeleporterMessageReceipt[]\",\"components\":[{\"name\":\"receivedMessageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"relayerRewardAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RelayerRewardsRedeemed\",\"inputs\":[{\"name\":\"redeemer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"asset\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SendCrossChainMessage\",\"inputs\":[{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTeleporterMessage\",\"components\":[{\"name\":\"messageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originSenderAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"requiredGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowedRelayerAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"receipts\",\"type\":\"tuple[]\",\"internalType\":\"structTeleporterMessageReceipt[]\",\"components\":[{\"name\":\"receivedMessageNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"relayerRewardAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"feeInfo\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTeleporterFeeInfo\",\"components\":[{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x6080604052348015600e575f80fd5b5060015f81905580556130e9806100245f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c8063a8898181116100bf578063df20e8bc11610079578063df20e8bc14610331578063e69d606a14610344578063e6e67bd5146103ab578063ebc3b1ba146103e6578063ecc7042814610409578063fc2d619714610412575f80fd5b8063a8898181146102a9578063a9a85614146102bc578063b771b3bc146102cf578063c473eef8146102dd578063ccb5f80914610315578063d127dc9b14610328575f80fd5b8063399b77da11610110578063399b77da1461021257806362448850146102315780638245a1b014610244578063860a3b0614610257578063892bf412146102765780638ac0fd0414610296575f80fd5b80630af5b4ff1461014c57806322296c3a146101675780632bc8b0bf1461017c5780632ca40f551461018f5780632e27c223146101e7575b5f80fd5b610154610425565b6040519081526020015b60405180910390f35b61017a610175366004612111565b6104f3565b005b61015461018a36600461212c565b6105e6565b6101d961019d36600461212c565b600560209081525f9182526040918290208054835180850190945260018201546001600160a01b03168452600290910154918301919091529082565b60405161015e929190612143565b6101fa6101f536600461212c565b610602565b6040516001600160a01b03909116815260200161015e565b61015461022036600461212c565b5f9081526005602052604090205490565b61015461023f36600461216a565b610689565b61017a6102523660046121b7565b6106e2565b61015461026536600461212c565b60066020525f908152604090205481565b6102896102843660046121e8565b610885565b60405161015e9190612208565b61017a6102a4366004612228565b6108b6565b6101546102b736600461225d565b610aed565b6101546102ca3660046122cd565b610b2f565b6101fa6005600160991b0181565b6101546102eb36600461235e565b6001600160a01b039182165f90815260096020908152604080832093909416825291909152205490565b61017a610323366004612395565b610dc1565b61015460025481565b61015461033f36600461212c565b6111e3565b61038c61035236600461212c565b5f90815260056020908152604091829020825180840190935260018101546001600160a01b03168084526002909101549290910182905291565b604080516001600160a01b03909316835260208301919091520161015e565b6103d16103b936600461212c565b60046020525f90815260409020805460019091015482565b6040805192835260208301919091520161015e565b6103f96103f436600461212c565b61122a565b604051901515815260200161015e565b61015460035481565b61017a6104203660046123b9565b61123f565b6002545f90806104ee576005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049691906123fc565b9050806104be5760405162461bcd60e51b81526004016104b590612413565b60405180910390fd5b600281905560405181907f1eac640109dc937d2a9f42735a05f794b39a5e3759d681951d671aabbce4b104905f90a25b919050565b335f9081526009602090815260408083206001600160a01b0385168452909152902054806105745760405162461bcd60e51b815260206004820152602860248201527f54656c65706f727465724d657373656e6765723a206e6f2072657761726420746044820152676f2072656465656d60c01b60648201526084016104b5565b335f8181526009602090815260408083206001600160a01b03871680855290835281842093909355518481529192917f3294c84e5b0f29d9803655319087207bc94f4db29f7927846944822773780b88910160405180910390a36105e26001600160a01b0383163383611494565b5050565b5f8181526004602052604081206105fc906114f8565b92915050565b5f8181526007602052604081205461066e5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f74604482015268081c9958d95a5d995960ba1b60648201526084016104b5565b505f908152600860205260409020546001600160a01b031690565b5f60015f54146106ab5760405162461bcd60e51b81526004016104b59061245a565b60025f556106d86106bb83612691565b83355f9081526004602052604090206106d39061150a565b611604565b60015f5592915050565b60015f54146107035760405162461bcd60e51b81526004016104b59061245a565b60025f818155905461071b9060408401358435610aed565b5f818152600560209081526040918290208251808401845281548152835180850190945260018201546001600160a01b0316845260029091015483830152908101919091528051919250906107825760405162461bcd60e51b81526004016104b590612730565b5f8360405160200161079491906129af565b60408051601f19818403018152919052825181516020830120919250146107cd5760405162461bcd60e51b81526004016104b5906129c1565b8360400135837f2a211ad4a59ab9d003852404f9c57c690704ee755f3c79d2c2812ad32da99df8868560200151604051610808929190612a0a565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061083a908490600401612a8b565b6020604051808303815f875af1158015610856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087a91906123fc565b505060015f55505050565b604080518082019091525f80825260208201525f8381526004602052604090206108af9083611837565b9392505050565b60015f54146108d75760405162461bcd60e51b81526004016104b59061245a565b60025f5560018054146108fc5760405162461bcd60e51b81526004016104b590612a9d565b6002600155806109665760405162461bcd60e51b815260206004820152602f60248201527f54656c65706f727465724d657373656e6765723a207a65726f2061646469746960448201526e1bdb985b0819995948185b5bdd5b9d608a1b60648201526084016104b5565b6001600160a01b03821661098c5760405162461bcd60e51b81526004016104b590612ae2565b5f838152600560205260409020546109b65760405162461bcd60e51b81526004016104b590612730565b5f838152600560205260409020600101546001600160a01b03838116911614610a475760405162461bcd60e51b815260206004820152603760248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642066656560448201527f20617373657420636f6e7472616374206164647265737300000000000000000060648201526084016104b5565b5f610a5283836118f8565b5f85815260056020526040812060020180549293508392909190610a77908490612b4a565b90915550505f8481526005602052604090819020905185917fc1bfd1f1208927dfbd414041dcb5256e6c9ad90dd61aec3249facbd34ff7b3e191610ad8916001019081546001600160a01b0316815260019190910154602082015260400190565b60405180910390a2505060018080555f555050565b6040805130602082015290810184905260608101839052608081018290525f9060a0016040516020818303038152906040528051906020012090509392505050565b5f60015f5414610b515760405162461bcd60e51b81526004016104b59061245a565b60025f818155905490866001600160401b03811115610b7257610b7261249d565b604051908082528060200260200182016040528015610bb657816020015b604080518082019091525f8082526020820152815260200190600190039081610b905790505b509050865f5b81811015610d2e575f8a8a83818110610bd757610bd7612b5d565b9050602002013590505f60075f8381526020019081526020015f20549050805f03610c535760405162461bcd60e51b815260206004820152602660248201527f54656c65706f727465724d657373656e6765723a2072656365697074206e6f7460448201526508199bdd5b9960d21b60648201526084016104b5565b610c5e8d8783610aed565b8214610cd25760405162461bcd60e51b815260206004820152603a60248201527f54656c65706f727465724d657373656e6765723a206d6573736167652049442060448201527f6e6f742066726f6d20736f7572636520626c6f636b636861696e00000000000060648201526084016104b5565b5f828152600860209081526040918290205482518084019093528383526001600160a01b03169082018190528651909190879086908110610d1557610d15612b5d565b6020026020010181905250505050806001019050610bbc565b506040805160c0810182528b81525f6020820152610daf918101610d57368b90038b018b612b71565b81526020015f81526020018888808060200260200160405190810160405280939291908181526020018383602002808284375f9201829052509385525050604080519283526020808401909152909201525083611604565b60015f559a9950505050505050505050565b6001805414610de25760405162461bcd60e51b81526004016104b590612a9d565b60026001556040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e579190810190612be7565b9150915080610eba5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b5565b60208201516001600160a01b03163014610f315760405162461bcd60e51b815260206004820152603260248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b5565b5f8260400151806020019051810190610f4a9190612d7b565b90505f610f55610425565b905080826040015114610fc45760405162461bcd60e51b815260206004820152603160248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206465736044820152701d1a5b985d1a5bdb8818da185a5b881251607a1b60648201526084016104b5565b835182515f91610fd5918490610aed565b5f81815260076020526040902054909150156110495760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f727465724d657373656e6765723a206d65737361676520616c7260448201526c1958591e481c9958d95a5d9959609a1b60648201526084016104b5565b611057338460a00151611a5a565b6110b55760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20756e617574686f72697a6560448201526832103932b630bcb2b960b91b60648201526084016104b5565b6110c281845f0151611ac6565b6001600160a01b038616156110f8575f81815260086020526040902080546001600160a01b0319166001600160a01b0388161790555b60c0830151515f5b8181101561113b5761113384885f01518760c00151848151811061112657611126612b5d565b6020026020010151611b36565b600101611100565b50604080518082018252855181526001600160a01b03891660208083019190915288515f90815260049091529190912061117491611c5a565b336001600160a01b0316865f0151837f292ee90bbaf70b5d4936025e09d56ba08f3e421156b6a568cf3c2840d9343e348a886040516111b4929190612f81565b60405180910390a460e084015151156111d5576111d582875f015186611cb4565b505060018055505050505050565b6002545f90806112055760405162461bcd60e51b81526004016104b590612413565b5f60035460016112159190612b4a565b9050611222828583610aed565b949350505050565b5f8181526007602052604081205415156105fc565b60018054146112605760405162461bcd60e51b81526004016104b590612a9d565b60026001819055545f906112779084908435610aed565b5f81815260066020526040902054909150806112a55760405162461bcd60e51b81526004016104b590612730565b80836040516020016112b791906129af565b60405160208183030381529060405280519060200120146112ea5760405162461bcd60e51b81526004016104b5906129c1565b5f6112fb6080850160608601612111565b6001600160a01b03163b1161136f5760405162461bcd60e51b815260206004820152603460248201527f54656c65706f727465724d657373656e6765723a2064657374696e6174696f6e604482015273206164647265737320686173206e6f20636f646560601b60648201526084016104b5565b604051849083907f34795cc6b122b9a0ae684946319f1e14a577b4e8f9b3dda9ac94c21a54d3188c905f90a35f82815260066020908152604080832083905586916113be918701908701612111565b6113cb60e0870187612fa4565b6040516024016113de9493929190612fe6565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b17905290505f61142561141e6080870160608801612111565b5a84611de3565b9050806114885760405162461bcd60e51b815260206004820152602b60248201527f54656c65706f727465724d657373656e6765723a20726574727920657865637560448201526a1d1a5bdb8819985a5b195960aa1b60648201526084016104b5565b50506001805550505050565b6040516001600160a01b038381166024830152604482018390526114f391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611dfa565b505050565b805460018201545f916105fc91613010565b60605f611520600561151b856114f8565b611e5b565b9050805f0361156c57604080515f8082526020820190925290611564565b604080518082019091525f808252602082015281526020019060019003908161153e5790505b509392505050565b5f816001600160401b038111156115855761158561249d565b6040519080825280602002602001820160405280156115c957816020015b604080518082019091525f80825260208201528152602001906001900390816115a35790505b5090505f5b82811015611564576115df85611e70565b8282815181106115f1576115f1612b5d565b60209081029190910101526001016115ce565b5f8061160e610425565b90505f60035f815461161f90613023565b91905081905590505f61163683875f015184610aed565b90505f604051806101000160405280848152602001336001600160a01b03168152602001885f0151815260200188602001516001600160a01b0316815260200188606001518152602001886080015181526020018781526020018860a0015181525090505f816040516020016116ac919061303b565b60405160208183030381529060405290505f808960400151602001511115611713576040890151516001600160a01b03166116f95760405162461bcd60e51b81526004016104b590612ae2565b6040890151805160209091015161171091906118f8565b90505b6040805180820182528a820151516001600160a01b03908116825260208083018590528351808501855286518783012081528082018481525f8a815260058452869020915182555180516001830180546001600160a01b03191691909516179093559101516002909101558a51915190919086907f2a211ad4a59ab9d003852404f9c57c690704ee755f3c79d2c2812ad32da99df8906117b6908890869061304d565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb906117e8908690600401612a8b565b6020604051808303815f875af1158015611804573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182891906123fc565b50939998505050505050505050565b604080518082019091525f8082526020820152611853836114f8565b82106118ab5760405162461bcd60e51b815260206004820152602160248201527f5265636569707451756575653a20696e646578206f7574206f6620626f756e646044820152607360f81b60648201526084016104b5565b826002015f83855f01546118bf9190612b4a565b815260208082019290925260409081015f20815180830190925280548252600101546001600160a01b0316918101919091529392505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561193e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196291906123fc565b90506119796001600160a01b038516333086611f3a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156119bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e191906123fc565b9050818111611a475760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b5565b611a518282613010565b95945050505050565b5f81515f03611a6b575060016105fc565b81515f5b81811015611abc57846001600160a01b0316848281518110611a9357611a93612b5d565b60200260200101516001600160a01b031603611ab4576001925050506105fc565b600101611a6f565b505f949350505050565b805f03611b255760405162461bcd60e51b815260206004820152602760248201527f54656c65706f727465724d657373656e6765723a207a65726f206d657373616760448201526665206e6f6e636560c81b60648201526084016104b5565b5f9182526007602052604090912055565b5f611b458484845f0151610aed565b5f818152600560209081526040918290208251808401845281548152835180850190945260018201546001600160a01b031684526002909101548383015290810191909152805191925090611b9b575050505050565b5f8281526005602090815260408083208381556001810180546001600160a01b03191690556002018390558382018051830151878401516001600160a01b0390811686526009855283862092515116855292528220805491929091611c01908490612b4a565b9250508190555082602001516001600160a01b031684837fd13a7935f29af029349bed0a2097455b91fd06190a30478c575db3f31e00bf578460200151604051611c4b919061305f565b60405180910390a45050505050565b600182018054829160028501915f9182611c7383613023565b9091555081526020808201929092526040015f2082518155910151600190910180546001600160a01b0319166001600160a01b039092169190911790555050565b80608001515a1015611d165760405162461bcd60e51b815260206004820152602560248201527f54656c65706f727465724d657373656e6765723a20696e73756666696369656e604482015264742067617360d81b60648201526084016104b5565b80606001516001600160a01b03163b5f03611d36576114f3838383611f79565b602081015160e08201516040515f92611d5392869260240161307f565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b179052606083015160808401519192505f91611d97919084611de3565b905080611db057611da9858585611f79565b5050505050565b604051849086907f34795cc6b122b9a0ae684946319f1e14a577b4e8f9b3dda9ac94c21a54d3188c905f90a35050505050565b5f805f808451602086015f8989f195945050505050565b5f611e0e6001600160a01b03841683611fed565b905080515f14158015611e32575080806020019051810190611e3091906130a8565b155b156114f357604051635274afe760e01b81526001600160a01b03841660048201526024016104b5565b5f818310611e6957816108af565b5090919050565b604080518082019091525f808252602082015281546001830154819003611ed95760405162461bcd60e51b815260206004820152601960248201527f5265636569707451756575653a20656d7074792071756575650000000000000060448201526064016104b5565b5f8181526002840160208181526040808420815180830190925280548252600180820180546001600160a01b03811685870152888852959094529490556001600160a01b0319909216905590611f30908390612b4a565b9093555090919050565b6040516001600160a01b038481166024830152838116604483015260648201839052611f739186918216906323b872dd906084016114c1565b50505050565b80604051602001611f8a919061303b565b60408051601f1981840301815282825280516020918201205f878152600690925291902055829084907f4619adc1017b82e02eaefac01a43d50d6d8de4460774bc370c3ff0210d40c98590611fe090859061303b565b60405180910390a3505050565b60606108af83835f845f80856001600160a01b0316848660405161201191906130c1565b5f6040518083038185875af1925050503d805f811461204b576040519150601f19603f3d011682016040523d82523d5f602084013e612050565b606091505b509150915061206086838361206a565b9695505050505050565b60608261207f5761207a826120c6565b6108af565b815115801561209657506001600160a01b0384163b155b156120bf57604051639996b31560e01b81526001600160a01b03851660048201526024016104b5565b50806108af565b8051156120d65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b6001600160a01b03811681146120ef575f80fd5b80356104ee816120f2565b5f60208284031215612121575f80fd5b81356108af816120f2565b5f6020828403121561213c575f80fd5b5035919050565b828152606081016108af602083018480516001600160a01b03168252602090810151910152565b5f6020828403121561217a575f80fd5b81356001600160401b0381111561218f575f80fd5b820160e081850312156108af575f80fd5b5f61010082840312156121b1575f80fd5b50919050565b5f602082840312156121c7575f80fd5b81356001600160401b038111156121dc575f80fd5b611222848285016121a0565b5f80604083850312156121f9575f80fd5b50508035926020909101359150565b815181526020808301516001600160a01b031690820152604081016105fc565b5f805f6060848603121561223a575f80fd5b83359250602084013561224c816120f2565b929592945050506040919091013590565b5f805f6060848603121561226f575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112612296575f80fd5b5081356001600160401b038111156122ac575f80fd5b6020830191508360208260051b85010111156122c6575f80fd5b9250929050565b5f805f805f8086880360a08112156122e3575f80fd5b8735965060208801356001600160401b0380821115612300575f80fd5b61230c8b838c01612286565b90985096508691506040603f1984011215612325575f80fd5b60408a01955060808a013592508083111561233e575f80fd5b505061234c89828a01612286565b979a9699509497509295939492505050565b5f806040838503121561236f575f80fd5b823561237a816120f2565b9150602083013561238a816120f2565b809150509250929050565b5f80604083850312156123a6575f80fd5b823563ffffffff8116811461237a575f80fd5b5f80604083850312156123ca575f80fd5b8235915060208301356001600160401b038111156123e6575f80fd5b6123f2858286016121a0565b9150509250929050565b5f6020828403121561240c575f80fd5b5051919050565b60208082526027908201527f54656c65706f727465724d657373656e6765723a207a65726f20626c6f636b636040820152661a185a5b88125160ca1b606082015260800190565b60208082526023908201527f5265656e7472616e63794775617264733a2073656e646572207265656e7472616040820152626e637960e81b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156124d3576124d361249d565b60405290565b60405160c081016001600160401b03811182821017156124d3576124d361249d565b60405161010081016001600160401b03811182821017156124d3576124d361249d565b604051601f8201601f191681016001600160401b03811182821017156125465761254661249d565b604052919050565b5f6040828403121561255e575f80fd5b6125666124b1565b90508135612573816120f2565b808252506020820135602082015292915050565b5f6001600160401b0382111561259f5761259f61249d565b5060051b60200190565b5f82601f8301126125b8575f80fd5b813560206125cd6125c883612587565b61251e565b8083825260208201915060208460051b8701019350868411156125ee575f80fd5b602086015b84811015612613578035612606816120f2565b83529183019183016125f3565b509695505050505050565b5f6001600160401b038211156126365761263661249d565b50601f01601f191660200190565b5f82601f830112612653575f80fd5b81356126616125c88261261e565b818152846020838601011115612675575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60e082360312156126a1575f80fd5b6126a96124d9565b823581526126b960208401612106565b60208201526126cb366040850161254e565b60408201526080830135606082015260a08301356001600160401b03808211156126f3575f80fd5b6126ff368387016125a9565b608084015260c0850135915080821115612717575f80fd5b5061272436828601612644565b60a08301525092915050565b60208082526026908201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f7460408201526508199bdd5b9960d21b606082015260800190565b5f808335601e1984360301811261278b575f80fd5b83016020810192503590506001600160401b038111156127a9575f80fd5b8060051b36038213156122c6575f80fd5b8183525f60208085019450825f5b858110156127f65781356127db816120f2565b6001600160a01b0316875295820195908201906001016127c8565b509495945050505050565b5f808335601e19843603018112612816575f80fd5b83016020810192503590506001600160401b03811115612834575f80fd5b8060061b36038213156122c6575f80fd5b8183525f60208085019450825f5b858110156127f657813587528282013561286c816120f2565b6001600160a01b0316878401526040968701969190910190600101612853565b5f808335601e198436030181126128a1575f80fd5b83016020810192503590506001600160401b038111156128bf575f80fd5b8036038213156122c6575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f61010082358452602083013561290b816120f2565b6001600160a01b031660208501526040838101359085015261292f60608401612106565b6001600160a01b031660608501526080838101359085015261295460a0840184612776565b8260a087015261296783870182846127ba565b9250505061297860c0840184612801565b85830360c087015261298b838284612845565b9250505061299c60e084018461288c565b85830360e08701526120608382846128cd565b602081525f6108af60208301846128f5565b60208082526029908201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206d65736040820152680e6c2ceca40d0c2e6d60bb1b606082015260800190565b606081525f612a1c60608301856128f5565b90506108af602083018480516001600160a01b03168252602090810151910152565b5f5b83811015612a58578181015183820152602001612a40565b50505f910152565b5f8151808452612a77816020860160208601612a3e565b601f01601f19169290920160200192915050565b602081525f6108af6020830184612a60565b60208082526025908201527f5265656e7472616e63794775617264733a207265636569766572207265656e7460408201526472616e637960d81b606082015260800190565b60208082526034908201527f54656c65706f727465724d657373656e6765723a207a65726f2066656520617360408201527373657420636f6e7472616374206164647265737360601b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105fc576105fc612b36565b634e487b7160e01b5f52603260045260245ffd5b5f60408284031215612b81575f80fd5b6108af838361254e565b80516104ee816120f2565b5f82601f830112612ba5575f80fd5b8151612bb36125c88261261e565b818152846020838601011115612bc7575f80fd5b611222826020830160208701612a3e565b805180151581146104ee575f80fd5b5f8060408385031215612bf8575f80fd5b82516001600160401b0380821115612c0e575f80fd5b9084019060608287031215612c21575f80fd5b604051606081018181108382111715612c3c57612c3c61249d565b604052825181526020830151612c51816120f2565b6020820152604083015182811115612c67575f80fd5b612c7388828601612b96565b6040830152509350612c8a91505060208401612bd8565b90509250929050565b5f82601f830112612ca2575f80fd5b81516020612cb26125c883612587565b8083825260208201915060208460051b870101935086841115612cd3575f80fd5b602086015b84811015612613578051612ceb816120f2565b8352918301918301612cd8565b5f82601f830112612d07575f80fd5b81516020612d176125c883612587565b82815260069290921b84018101918181019086841115612d35575f80fd5b8286015b848110156126135760408189031215612d50575f80fd5b612d586124b1565b8151815284820151612d69816120f2565b81860152835291830191604001612d39565b5f60208284031215612d8b575f80fd5b81516001600160401b0380821115612da1575f80fd5b908301906101008286031215612db5575f80fd5b612dbd6124fb565b82518152612dcd60208401612b8b565b602082015260408301516040820152612de860608401612b8b565b60608201526080830151608082015260a083015182811115612e08575f80fd5b612e1487828601612c93565b60a08301525060c083015182811115612e2b575f80fd5b612e3787828601612cf8565b60c08301525060e083015182811115612e4e575f80fd5b612e5a87828601612b96565b60e08301525095945050505050565b5f815180845260208085019450602084015f5b838110156127f65781516001600160a01b031687529582019590820190600101612e7c565b5f815180845260208085019450602084015f5b838110156127f657612eda878351805182526020908101516001600160a01b0316910152565b6040969096019590820190600101612eb4565b5f6101008251845260018060a01b036020840151166020850152604083015160408501526060830151612f2b60608601826001600160a01b03169052565b506080830151608085015260a08301518160a0860152612f4d82860182612e69565b91505060c083015184820360c0860152612f678282612ea1565b91505060e083015184820360e0860152611a518282612a60565b6001600160a01b03831681526040602082018190525f9061122290830184612eed565b5f808335601e19843603018112612fb9575f80fd5b8301803591506001600160401b03821115612fd2575f80fd5b6020019150368190038213156122c6575f80fd5b8481526001600160a01b03841660208201526060604082018190525f9061206090830184866128cd565b818103818111156105fc576105fc612b36565b5f6001820161303457613034612b36565b5060010190565b602081525f6108af6020830184612eed565b606081525f612a1c6060830185612eed565b81516001600160a01b0316815260208083015190820152604081016105fc565b8381526001600160a01b03831660208201526060604082018190525f90611a5190830184612a60565b5f602082840312156130b8575f80fd5b6108af82612bd8565b5f82516130d2818460208701612a3e565b919091019291505056fea164736f6c6343000819000a", + Bin: "0x6080604052348015600e575f80fd5b5060015f81905580556130be806100245f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c8063a8898181116100bf578063df20e8bc11610079578063df20e8bc14610326578063e69d606a14610339578063e6e67bd5146103a0578063ebc3b1ba146103db578063ecc70428146103fe578063fc2d619714610407575f80fd5b8063a88981811461029e578063a9a85614146102b1578063b771b3bc146102c4578063c473eef8146102d2578063ccb5f8091461030a578063d127dc9b1461031d575f80fd5b8063399b77da11610110578063399b77da1461020757806362448850146102265780638245a1b014610239578063860a3b061461024c578063892bf4121461026b5780638ac0fd041461028b575f80fd5b80630af5b4ff1461014c57806322296c3a146101675780632bc8b0bf1461017c5780632ca40f551461018f5780632e27c223146101e7575b5f80fd5b61015461041a565b6040519081526020015b60405180910390f35b61017a6101753660046120f2565b6104e8565b005b61015461018a36600461210d565b6105db565b6101d961019d36600461210d565b600560209081525f9182526040918290208054835180850190945260018201546001600160a01b03168452600290910154918301919091529082565b60405161015e92919061213c565b6101fa6101f536600461210d565b6105f7565b60405161015e9190612150565b61015461021536600461210d565b5f9081526005602052604090205490565b610154610234366004612164565b61067e565b61017a6102473660046121b1565b6106d7565b61015461025a36600461210d565b60066020525f908152604090205481565b61027e6102793660046121e2565b61087a565b60405161015e9190612202565b61017a610299366004612222565b6108ab565b6101546102ac366004612257565b610adc565b6101546102bf3660046122c7565b610b1e565b6101fa6005600160991b0181565b6101546102e0366004612358565b6001600160a01b039182165f90815260096020908152604080832093909416825291909152205490565b61017a61031836600461238f565b610db0565b61015460025481565b61015461033436600461210d565b6111d2565b61038161034736600461210d565b5f90815260056020908152604091829020825180840190935260018101546001600160a01b03168084526002909101549290910182905291565b604080516001600160a01b03909316835260208301919091520161015e565b6103c66103ae36600461210d565b60046020525f90815260409020805460019091015482565b6040805192835260208301919091520161015e565b6103ee6103e936600461210d565b611219565b604051901515815260200161015e565b61015460035481565b61017a6104153660046123b3565b61122e565b6002545f90806104e3576005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610467573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048b91906123f6565b9050806104b35760405162461bcd60e51b81526004016104aa9061240d565b60405180910390fd5b600281905560405181907f1eac640109dc937d2a9f42735a05f794b39a5e3759d681951d671aabbce4b104905f90a25b919050565b335f9081526009602090815260408083206001600160a01b0385168452909152902054806105695760405162461bcd60e51b815260206004820152602860248201527f54656c65706f727465724d657373656e6765723a206e6f2072657761726420746044820152676f2072656465656d60c01b60648201526084016104aa565b335f8181526009602090815260408083206001600160a01b03871680855290835281842093909355518481529192917f3294c84e5b0f29d9803655319087207bc94f4db29f7927846944822773780b88910160405180910390a36105d76001600160a01b0383163383611483565b5050565b5f8181526004602052604081206105f1906114e7565b92915050565b5f818152600760205260408120546106635760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f74604482015268081c9958d95a5d995960ba1b60648201526084016104aa565b505f908152600860205260409020546001600160a01b031690565b5f60015f54146106a05760405162461bcd60e51b81526004016104aa90612454565b60025f556106cd6106b08361268b565b83355f9081526004602052604090206106c8906114f9565b6115f3565b60015f5592915050565b60015f54146106f85760405162461bcd60e51b81526004016104aa90612454565b60025f81815590546107109060408401358435610adc565b5f818152600560209081526040918290208251808401845281548152835180850190945260018201546001600160a01b0316845260029091015483830152908101919091528051919250906107775760405162461bcd60e51b81526004016104aa9061272a565b5f8360405160200161078991906129a9565b60408051601f19818403018152919052825181516020830120919250146107c25760405162461bcd60e51b81526004016104aa906129bb565b8360400135837f2a211ad4a59ab9d003852404f9c57c690704ee755f3c79d2c2812ad32da99df88685602001516040516107fd929190612a04565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061082f908490600401612a72565b6020604051808303815f875af115801561084b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086f91906123f6565b505060015f55505050565b604080518082019091525f80825260208201525f8381526004602052604090206108a49083611826565b9392505050565b60015f54146108cc5760405162461bcd60e51b81526004016104aa90612454565b60025f5560018054146108f15760405162461bcd60e51b81526004016104aa90612a84565b60026001558061095b5760405162461bcd60e51b815260206004820152602f60248201527f54656c65706f727465724d657373656e6765723a207a65726f2061646469746960448201526e1bdb985b0819995948185b5bdd5b9d608a1b60648201526084016104aa565b6001600160a01b0382166109815760405162461bcd60e51b81526004016104aa90612ac9565b5f838152600560205260409020546109ab5760405162461bcd60e51b81526004016104aa9061272a565b5f838152600560205260409020600101546001600160a01b03838116911614610a365760405162461bcd60e51b815260206004820152603760248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642066656560448201527620617373657420636f6e7472616374206164647265737360481b60648201526084016104aa565b5f610a4183836118e7565b5f85815260056020526040812060020180549293508392909190610a66908490612b31565b90915550505f8481526005602052604090819020905185917fc1bfd1f1208927dfbd414041dcb5256e6c9ad90dd61aec3249facbd34ff7b3e191610ac7916001019081546001600160a01b0316815260019190910154602082015260400190565b60405180910390a2505060018080555f555050565b6040805130602082015290810184905260608101839052608081018290525f9060a0016040516020818303038152906040528051906020012090509392505050565b5f60015f5414610b405760405162461bcd60e51b81526004016104aa90612454565b60025f818155905490866001600160401b03811115610b6157610b61612497565b604051908082528060200260200182016040528015610ba557816020015b604080518082019091525f8082526020820152815260200190600190039081610b7f5790505b509050865f5b81811015610d1d575f8a8a83818110610bc657610bc6612b44565b9050602002013590505f60075f8381526020019081526020015f20549050805f03610c425760405162461bcd60e51b815260206004820152602660248201527f54656c65706f727465724d657373656e6765723a2072656365697074206e6f7460448201526508199bdd5b9960d21b60648201526084016104aa565b610c4d8d8783610adc565b8214610cc15760405162461bcd60e51b815260206004820152603a60248201527f54656c65706f727465724d657373656e6765723a206d6573736167652049442060448201527f6e6f742066726f6d20736f7572636520626c6f636b636861696e00000000000060648201526084016104aa565b5f828152600860209081526040918290205482518084019093528383526001600160a01b03169082018190528651909190879086908110610d0457610d04612b44565b6020026020010181905250505050806001019050610bab565b506040805160c0810182528b81525f6020820152610d9e918101610d46368b90038b018b612b58565b81526020015f81526020018888808060200260200160405190810160405280939291908181526020018383602002808284375f92018290525093855250506040805192835260208084019091529092015250836115f3565b60015f559a9950505050505050505050565b6001805414610dd15760405162461bcd60e51b81526004016104aa90612a84565b60026001556040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e1f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e469190810190612bce565b9150915080610ea95760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104aa565b60208201516001600160a01b03163014610f205760405162461bcd60e51b815260206004820152603260248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104aa565b5f8260400151806020019051810190610f399190612d62565b90505f610f4461041a565b905080826040015114610fb35760405162461bcd60e51b815260206004820152603160248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206465736044820152701d1a5b985d1a5bdb8818da185a5b881251607a1b60648201526084016104aa565b835182515f91610fc4918490610adc565b5f81815260076020526040902054909150156110385760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f727465724d657373656e6765723a206d65737361676520616c7260448201526c1958591e481c9958d95a5d9959609a1b60648201526084016104aa565b611046338460a00151611a51565b6110a45760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20756e617574686f72697a6560448201526832103932b630bcb2b960b91b60648201526084016104aa565b6110b181845f0151611abd565b6001600160a01b038616156110e7575f81815260086020526040902080546001600160a01b0319166001600160a01b0388161790555b60c0830151515f5b8181101561112a5761112284885f01518760c00151848151811061111557611115612b44565b6020026020010151611b2d565b6001016110ef565b50604080518082018252855181526001600160a01b03891660208083019190915288515f90815260049091529190912061116391611c51565b336001600160a01b0316865f0151837f292ee90bbaf70b5d4936025e09d56ba08f3e421156b6a568cf3c2840d9343e348a886040516111a3929190612f68565b60405180910390a460e084015151156111c4576111c482875f015186611cab565b505060018055505050505050565b6002545f90806111f45760405162461bcd60e51b81526004016104aa9061240d565b5f60035460016112049190612b31565b9050611211828583610adc565b949350505050565b5f8181526007602052604081205415156105f1565b600180541461124f5760405162461bcd60e51b81526004016104aa90612a84565b60026001819055545f906112669084908435610adc565b5f81815260066020526040902054909150806112945760405162461bcd60e51b81526004016104aa9061272a565b80836040516020016112a691906129a9565b60405160208183030381529060405280519060200120146112d95760405162461bcd60e51b81526004016104aa906129bb565b5f6112ea60808501606086016120f2565b6001600160a01b03163b1161135e5760405162461bcd60e51b815260206004820152603460248201527f54656c65706f727465724d657373656e6765723a2064657374696e6174696f6e604482015273206164647265737320686173206e6f20636f646560601b60648201526084016104aa565b604051849083907f34795cc6b122b9a0ae684946319f1e14a577b4e8f9b3dda9ac94c21a54d3188c905f90a35f82815260066020908152604080832083905586916113ad9187019087016120f2565b6113ba60e0870187612f8b565b6040516024016113cd9493929190612fcd565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b17905290505f61141461140d60808701606088016120f2565b5a84611dda565b9050806114775760405162461bcd60e51b815260206004820152602b60248201527f54656c65706f727465724d657373656e6765723a20726574727920657865637560448201526a1d1a5bdb8819985a5b195960aa1b60648201526084016104aa565b50506001805550505050565b6040516001600160a01b038381166024830152604482018390526114e291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611df1565b505050565b805460018201545f916105f191612ff7565b60605f61150f600561150a856114e7565b611e49565b9050805f0361155b57604080515f8082526020820190925290611553565b604080518082019091525f808252602082015281526020019060019003908161152d5790505b509392505050565b5f816001600160401b0381111561157457611574612497565b6040519080825280602002602001820160405280156115b857816020015b604080518082019091525f80825260208201528152602001906001900390816115925790505b5090505f5b82811015611553576115ce85611e5e565b8282815181106115e0576115e0612b44565b60209081029190910101526001016115bd565b5f806115fd61041a565b90505f60035f815461160e9061300a565b91905081905590505f61162583875f015184610adc565b90505f604051806101000160405280848152602001336001600160a01b03168152602001885f0151815260200188602001516001600160a01b0316815260200188606001518152602001886080015181526020018781526020018860a0015181525090505f8160405160200161169b9190613022565b60405160208183030381529060405290505f808960400151602001511115611702576040890151516001600160a01b03166116e85760405162461bcd60e51b81526004016104aa90612ac9565b604089015180516020909101516116ff91906118e7565b90505b6040805180820182528a820151516001600160a01b03908116825260208083018590528351808501855286518783012081528082018481525f8a815260058452869020915182555180516001830180546001600160a01b03191691909516179093559101516002909101558a51915190919086907f2a211ad4a59ab9d003852404f9c57c690704ee755f3c79d2c2812ad32da99df8906117a59088908690613034565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb906117d7908690600401612a72565b6020604051808303815f875af11580156117f3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181791906123f6565b50939998505050505050505050565b604080518082019091525f8082526020820152611842836114e7565b821061189a5760405162461bcd60e51b815260206004820152602160248201527f5265636569707451756575653a20696e646578206f7574206f6620626f756e646044820152607360f81b60648201526084016104aa565b826002015f83855f01546118ae9190612b31565b815260208082019290925260409081015f20815180830190925280548252600101546001600160a01b0316918101919091529392505050565b5f80836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016119159190612150565b602060405180830381865afa158015611930573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061195491906123f6565b905061196b6001600160a01b038516333086611f24565b6040516370a0823160e01b81525f906001600160a01b038616906370a0823190611999903090600401612150565b602060405180830381865afa1580156119b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d891906123f6565b9050818111611a3e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104aa565b611a488282612ff7565b95945050505050565b5f81515f03611a62575060016105f1565b81515f5b81811015611ab357846001600160a01b0316848281518110611a8a57611a8a612b44565b60200260200101516001600160a01b031603611aab576001925050506105f1565b600101611a66565b505f949350505050565b805f03611b1c5760405162461bcd60e51b815260206004820152602760248201527f54656c65706f727465724d657373656e6765723a207a65726f206d657373616760448201526665206e6f6e636560c81b60648201526084016104aa565b5f9182526007602052604090912055565b5f611b3c8484845f0151610adc565b5f818152600560209081526040918290208251808401845281548152835180850190945260018201546001600160a01b031684526002909101548383015290810191909152805191925090611b92575050505050565b5f8281526005602090815260408083208381556001810180546001600160a01b03191690556002018390558382018051830151878401516001600160a01b0390811686526009855283862092515116855292528220805491929091611bf8908490612b31565b9250508190555082602001516001600160a01b031684837fd13a7935f29af029349bed0a2097455b91fd06190a30478c575db3f31e00bf578460200151604051611c429190613046565b60405180910390a45050505050565b600182018054829160028501915f9182611c6a8361300a565b9091555081526020808201929092526040015f2082518155910151600190910180546001600160a01b0319166001600160a01b039092169190911790555050565b80608001515a1015611d0d5760405162461bcd60e51b815260206004820152602560248201527f54656c65706f727465724d657373656e6765723a20696e73756666696369656e604482015264742067617360d81b60648201526084016104aa565b80606001516001600160a01b03163b5f03611d2d576114e2838383611f63565b602081015160e08201516040515f92611d4a928692602401613054565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b179052606083015160808401519192505f91611d8e919084611dda565b905080611da757611da0858585611f63565b5050505050565b604051849086907f34795cc6b122b9a0ae684946319f1e14a577b4e8f9b3dda9ac94c21a54d3188c905f90a35050505050565b5f805f808451602086015f8989f195945050505050565b5f611e056001600160a01b03841683611fd7565b905080515f14158015611e29575080806020019051810190611e27919061307d565b155b156114e25782604051635274afe760e01b81526004016104aa9190612150565b5f818310611e5757816108a4565b5090919050565b604080518082019091525f808252602082015281546001830154819003611ec35760405162461bcd60e51b81526020600482015260196024820152785265636569707451756575653a20656d70747920717565756560381b60448201526064016104aa565b5f8181526002840160208181526040808420815180830190925280548252600180820180546001600160a01b03811685870152888852959094529490556001600160a01b0319909216905590611f1a908390612b31565b9093555090919050565b6040516001600160a01b038481166024830152838116604483015260648201839052611f5d9186918216906323b872dd906084016114b0565b50505050565b80604051602001611f749190613022565b60408051601f1981840301815282825280516020918201205f878152600690925291902055829084907f4619adc1017b82e02eaefac01a43d50d6d8de4460774bc370c3ff0210d40c98590611fca908590613022565b60405180910390a3505050565b60606108a483835f845f80856001600160a01b03168486604051611ffb9190613096565b5f6040518083038185875af1925050503d805f8114612035576040519150601f19603f3d011682016040523d82523d5f602084013e61203a565b606091505b509150915061204a868383612054565b9695505050505050565b60608261206957612064826120a7565b6108a4565b815115801561208057506001600160a01b0384163b155b156120a05783604051639996b31560e01b81526004016104aa9190612150565b50806108a4565b8051156120b75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b6001600160a01b03811681146120d0575f80fd5b80356104e3816120d3565b5f60208284031215612102575f80fd5b81356108a4816120d3565b5f6020828403121561211d575f80fd5b5035919050565b80516001600160a01b03168252602090810151910152565b828152606081016108a46020830184612124565b6001600160a01b0391909116815260200190565b5f60208284031215612174575f80fd5b81356001600160401b03811115612189575f80fd5b820160e081850312156108a4575f80fd5b5f61010082840312156121ab575f80fd5b50919050565b5f602082840312156121c1575f80fd5b81356001600160401b038111156121d6575f80fd5b6112118482850161219a565b5f80604083850312156121f3575f80fd5b50508035926020909101359150565b815181526020808301516001600160a01b031690820152604081016105f1565b5f805f60608486031215612234575f80fd5b833592506020840135612246816120d3565b929592945050506040919091013590565b5f805f60608486031215612269575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112612290575f80fd5b5081356001600160401b038111156122a6575f80fd5b6020830191508360208260051b85010111156122c0575f80fd5b9250929050565b5f805f805f8086880360a08112156122dd575f80fd5b8735965060208801356001600160401b03808211156122fa575f80fd5b6123068b838c01612280565b90985096508691506040603f198401121561231f575f80fd5b60408a01955060808a0135925080831115612338575f80fd5b505061234689828a01612280565b979a9699509497509295939492505050565b5f8060408385031215612369575f80fd5b8235612374816120d3565b91506020830135612384816120d3565b809150509250929050565b5f80604083850312156123a0575f80fd5b823563ffffffff81168114612374575f80fd5b5f80604083850312156123c4575f80fd5b8235915060208301356001600160401b038111156123e0575f80fd5b6123ec8582860161219a565b9150509250929050565b5f60208284031215612406575f80fd5b5051919050565b60208082526027908201527f54656c65706f727465724d657373656e6765723a207a65726f20626c6f636b636040820152661a185a5b88125160ca1b606082015260800190565b60208082526023908201527f5265656e7472616e63794775617264733a2073656e646572207265656e7472616040820152626e637960e81b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156124cd576124cd612497565b60405290565b60405160c081016001600160401b03811182821017156124cd576124cd612497565b60405161010081016001600160401b03811182821017156124cd576124cd612497565b604051601f8201601f191681016001600160401b038111828210171561254057612540612497565b604052919050565b5f60408284031215612558575f80fd5b6125606124ab565b9050813561256d816120d3565b808252506020820135602082015292915050565b5f6001600160401b0382111561259957612599612497565b5060051b60200190565b5f82601f8301126125b2575f80fd5b813560206125c76125c283612581565b612518565b8083825260208201915060208460051b8701019350868411156125e8575f80fd5b602086015b8481101561260d578035612600816120d3565b83529183019183016125ed565b509695505050505050565b5f6001600160401b0382111561263057612630612497565b50601f01601f191660200190565b5f82601f83011261264d575f80fd5b813561265b6125c282612618565b81815284602083860101111561266f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60e0823603121561269b575f80fd5b6126a36124d3565b823581526126b3602084016120e7565b60208201526126c53660408501612548565b60408201526080830135606082015260a08301356001600160401b03808211156126ed575f80fd5b6126f9368387016125a3565b608084015260c0850135915080821115612711575f80fd5b5061271e3682860161263e565b60a08301525092915050565b60208082526026908201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f7460408201526508199bdd5b9960d21b606082015260800190565b5f808335601e19843603018112612785575f80fd5b83016020810192503590506001600160401b038111156127a3575f80fd5b8060051b36038213156122c0575f80fd5b8183525f60208085019450825f5b858110156127f05781356127d5816120d3565b6001600160a01b0316875295820195908201906001016127c2565b509495945050505050565b5f808335601e19843603018112612810575f80fd5b83016020810192503590506001600160401b0381111561282e575f80fd5b8060061b36038213156122c0575f80fd5b8183525f60208085019450825f5b858110156127f0578135875282820135612866816120d3565b6001600160a01b031687840152604096870196919091019060010161284d565b5f808335601e1984360301811261289b575f80fd5b83016020810192503590506001600160401b038111156128b9575f80fd5b8036038213156122c0575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f610100823584526020830135612905816120d3565b6001600160a01b0316602085015260408381013590850152612929606084016120e7565b6001600160a01b031660608501526080838101359085015261294e60a0840184612770565b8260a087015261296183870182846127b4565b9250505061297260c08401846127fb565b85830360c087015261298583828461283f565b9250505061299660e0840184612886565b85830360e087015261204a8382846128c7565b602081525f6108a460208301846128ef565b60208082526029908201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206d65736040820152680e6c2ceca40d0c2e6d60bb1b606082015260800190565b606081525f612a1660608301856128ef565b90506108a46020830184612124565b5f5b83811015612a3f578181015183820152602001612a27565b50505f910152565b5f8151808452612a5e816020860160208601612a25565b601f01601f19169290920160200192915050565b602081525f6108a46020830184612a47565b60208082526025908201527f5265656e7472616e63794775617264733a207265636569766572207265656e7460408201526472616e637960d81b606082015260800190565b60208082526034908201527f54656c65706f727465724d657373656e6765723a207a65726f2066656520617360408201527373657420636f6e7472616374206164647265737360601b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105f1576105f1612b1d565b634e487b7160e01b5f52603260045260245ffd5b5f60408284031215612b68575f80fd5b6108a48383612548565b80516104e3816120d3565b5f82601f830112612b8c575f80fd5b8151612b9a6125c282612618565b818152846020838601011115612bae575f80fd5b611211826020830160208701612a25565b805180151581146104e3575f80fd5b5f8060408385031215612bdf575f80fd5b82516001600160401b0380821115612bf5575f80fd5b9084019060608287031215612c08575f80fd5b604051606081018181108382111715612c2357612c23612497565b604052825181526020830151612c38816120d3565b6020820152604083015182811115612c4e575f80fd5b612c5a88828601612b7d565b6040830152509350612c7191505060208401612bbf565b90509250929050565b5f82601f830112612c89575f80fd5b81516020612c996125c283612581565b8083825260208201915060208460051b870101935086841115612cba575f80fd5b602086015b8481101561260d578051612cd2816120d3565b8352918301918301612cbf565b5f82601f830112612cee575f80fd5b81516020612cfe6125c283612581565b82815260069290921b84018101918181019086841115612d1c575f80fd5b8286015b8481101561260d5760408189031215612d37575f80fd5b612d3f6124ab565b8151815284820151612d50816120d3565b81860152835291830191604001612d20565b5f60208284031215612d72575f80fd5b81516001600160401b0380821115612d88575f80fd5b908301906101008286031215612d9c575f80fd5b612da46124f5565b82518152612db460208401612b72565b602082015260408301516040820152612dcf60608401612b72565b60608201526080830151608082015260a083015182811115612def575f80fd5b612dfb87828601612c7a565b60a08301525060c083015182811115612e12575f80fd5b612e1e87828601612cdf565b60c08301525060e083015182811115612e35575f80fd5b612e4187828601612b7d565b60e08301525095945050505050565b5f815180845260208085019450602084015f5b838110156127f05781516001600160a01b031687529582019590820190600101612e63565b5f815180845260208085019450602084015f5b838110156127f057612ec1878351805182526020908101516001600160a01b0316910152565b6040969096019590820190600101612e9b565b5f6101008251845260018060a01b036020840151166020850152604083015160408501526060830151612f1260608601826001600160a01b03169052565b506080830151608085015260a08301518160a0860152612f3482860182612e50565b91505060c083015184820360c0860152612f4e8282612e88565b91505060e083015184820360e0860152611a488282612a47565b6001600160a01b03831681526040602082018190525f9061121190830184612ed4565b5f808335601e19843603018112612fa0575f80fd5b8301803591506001600160401b03821115612fb9575f80fd5b6020019150368190038213156122c0575f80fd5b8481526001600160a01b03841660208201526060604082018190525f9061204a90830184866128c7565b818103818111156105f1576105f1612b1d565b5f6001820161301b5761301b612b1d565b5060010190565b602081525f6108a46020830184612ed4565b606081525f612a166060830185612ed4565b604081016105f18284612124565b8381526001600160a01b03831660208201526060604082018190525f90611a4890830184612a47565b5f6020828403121561308d575f80fd5b6108a482612bbf565b5f82516130a7818460208701612a25565b919091019291505056fea164736f6c6343000819000a", } // TeleporterMessengerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/teleporter/registry/TeleporterRegistry/TeleporterRegistry.go b/abi-bindings/go/teleporter/registry/TeleporterRegistry/TeleporterRegistry.go index 866500d7f..6171b011a 100644 --- a/abi-bindings/go/teleporter/registry/TeleporterRegistry/TeleporterRegistry.go +++ b/abi-bindings/go/teleporter/registry/TeleporterRegistry/TeleporterRegistry.go @@ -38,7 +38,7 @@ type ProtocolRegistryEntry struct { // TeleporterRegistryMetaData contains all meta data concerning the TeleporterRegistry contract. var TeleporterRegistryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"initialEntries\",\"type\":\"tuple[]\",\"internalType\":\"structProtocolRegistryEntry[]\",\"components\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"protocolAddress\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_VERSION_INCREMENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATORS_SOURCE_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addProtocolVersion\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blockchainID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAddressFromVersion\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestTeleporter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractITeleporterMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTeleporterFromVersion\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractITeleporterMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVersionFromAddress\",\"inputs\":[{\"name\":\"protocolAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AddProtocolVersion\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"protocolAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LatestVersionUpdated\",\"inputs\":[{\"name\":\"oldVersion\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"newVersion\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a060405234801561000f575f80fd5b50604051610fb7380380610fb783398101604081905261002e916103e2565b7302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561007e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a291906104bc565b60805280515f5b818110156100e1576100d98382815181106100c6576100c66104d3565b60200260200101516100e960201b60201c565b6001016100a9565b50505061050c565b80515f0361013e5760405162461bcd60e51b815260206004820181905260248201527f54656c65706f7274657252656769737472793a207a65726f2076657273696f6e60448201526064015b60405180910390fd5b80515f908152600160205260409020546001600160a01b0316156101b75760405162461bcd60e51b815260206004820152602a60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20616c72656044820152696164792065786973747360b01b6064820152608401610135565b60208101516001600160a01b03166102235760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472793a207a65726f2070726f746f636f6044820152686c206164647265737360b81b6064820152608401610135565b5f546102316101f4826104e7565b825111156102985760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20696e637260448201526d0cadacadce840e8dede40d0d2ced60931b6064820152608401610135565b6020828101805184515f90815260018452604080822080546001600160a01b0319166001600160a01b03948516179055925190911681526002909252902054825111156102ff5781516020808401516001600160a01b03165f908152600290915260409020555b602082015182516040516001600160a01b03909216917fa5eed93d951a9603d5f7c0a57de79a299dd3dbd5e51429be209d8053a42ab43a905f90a381518110156103725781515f81815560405183917f30623e953733f6474dabdfbef1103ce15ab73cdc77c6dfad0f9874d167e8a9b091a35b5050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156103ac576103ac610376565b60405290565b604051601f8201601f191681016001600160401b03811182821017156103da576103da610376565b604052919050565b5f60208083850312156103f3575f80fd5b82516001600160401b0380821115610409575f80fd5b818501915085601f83011261041c575f80fd5b81518181111561042e5761042e610376565b61043c848260051b016103b2565b818152848101925060069190911b83018401908782111561045b575f80fd5b928401925b818410156104b15760408489031215610477575f80fd5b61047f61038a565b84518152858501516001600160a01b038116811461049b575f80fd5b8187015283526040939093019291840191610460565b979650505050505050565b5f602082840312156104cc575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561050657634e487b7160e01b5f52601160045260245ffd5b92915050565b608051610a8c61052b5f395f818161014301526102580152610a8c5ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063ac473ac311610063578063ac473ac31461011f578063b771b3bc14610128578063c07f47d414610136578063d127dc9b1461013e578063d820e64f14610165575f80fd5b80630731775d1461009f578063215abce9146100c357806341f34ed9146100d657806346f9ef49146100eb5780634c1f08ce146100fe575b5f80fd5b6100a65f81565b6040516001600160a01b0390911681526020015b60405180910390f35b6100a66100d13660046107aa565b61016d565b6100e96100e43660046107c1565b61017d565b005b6100a66100f93660046107aa565b6103ec565b61011161010c366004610802565b6104ae565b6040519081526020016100ba565b6101116101f481565b6100a66005600160991b0181565b6101115f5481565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6100a6610554565b5f610177826103ec565b92915050565b6040516306f8253560e41b815263ffffffff821660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156101c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101ed919081019061089f565b91509150806102545760405162461bcd60e51b815260206004820152602860248201527f54656c65706f7274657252656769737472793a20696e76616c69642077617270604482015267206d65737361676560c01b60648201526084015b60405180910390fd5b81517f0000000000000000000000000000000000000000000000000000000000000000146102d85760405162461bcd60e51b815260206004820152602b60248201527f54656c65706f7274657252656769737472793a20696e76616c696420736f757260448201526a18d94818da185a5b88125160aa1b606482015260840161024b565b60208201516001600160a01b03161561034d5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472793a20696e76616c6964206f726967604482015270696e2073656e646572206164647265737360781b606482015260840161024b565b5f808360400151806020019051810190610367919061099e565b90925090506001600160a01b03811630146103dc5760405162461bcd60e51b815260206004820152602f60248201527f54656c65706f7274657252656769737472793a20696e76616c6964206465737460448201526e696e6174696f6e206164647265737360881b606482015260840161024b565b6103e582610564565b5050505050565b5f815f0361043c5760405162461bcd60e51b815260206004820181905260248201527f54656c65706f7274657252656769737472793a207a65726f2076657273696f6e604482015260640161024b565b5f828152600160205260409020546001600160a01b0316806101775760405162461bcd60e51b815260206004820152602560248201527f54656c65706f7274657252656769737472793a2076657273696f6e206e6f7420604482015264199bdd5b9960da1b606482015260840161024b565b5f6001600160a01b0382166104d55760405162461bcd60e51b815260040161024b90610a17565b6001600160a01b0382165f90815260026020526040812054908190036101775760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2070726f746f636f6c2061646460448201526d1c995cdcc81b9bdd08199bdd5b9960921b606482015260840161024b565b5f61055f5f546103ec565b905090565b80515f036105b45760405162461bcd60e51b815260206004820181905260248201527f54656c65706f7274657252656769737472793a207a65726f2076657273696f6e604482015260640161024b565b80515f908152600160205260409020546001600160a01b03161561062d5760405162461bcd60e51b815260206004820152602a60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20616c72656044820152696164792065786973747360b01b606482015260840161024b565b60208101516001600160a01b03166106575760405162461bcd60e51b815260040161024b90610a17565b5f546106656101f482610a60565b825111156106cc5760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20696e637260448201526d0cadacadce840e8dede40d0d2ced60931b606482015260840161024b565b6020828101805184515f90815260018452604080822080546001600160a01b0319166001600160a01b03948516179055925190911681526002909252902054825111156107335781516020808401516001600160a01b03165f908152600290915260409020555b602082015182516040516001600160a01b03909216917fa5eed93d951a9603d5f7c0a57de79a299dd3dbd5e51429be209d8053a42ab43a905f90a381518110156107a65781515f81815560405183917f30623e953733f6474dabdfbef1103ce15ab73cdc77c6dfad0f9874d167e8a9b091a35b5050565b5f602082840312156107ba575f80fd5b5035919050565b5f602082840312156107d1575f80fd5b813563ffffffff811681146107e4575f80fd5b9392505050565b6001600160a01b03811681146107ff575f80fd5b50565b5f60208284031215610812575f80fd5b81356107e4816107eb565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156108545761085461081d565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156108835761088361081d565b604052919050565b8051801515811461089a575f80fd5b919050565b5f80604083850312156108b0575f80fd5b825167ffffffffffffffff808211156108c7575f80fd5b90840190606082870312156108da575f80fd5b6108e2610831565b825181526020808401516108f5816107eb565b8282015260408401518381111561090a575f80fd5b80850194505087601f85011261091e575f80fd5b8351838111156109305761093061081d565b610942601f8201601f1916830161085a565b93508084528882828701011115610957575f80fd5b5f5b81811015610974578581018301518582018401528201610959565b505f8282860101525082604083015281955061099181880161088b565b9450505050509250929050565b5f8082840360608112156109b0575f80fd5b60408112156109bd575f80fd5b506040516040810181811067ffffffffffffffff821117156109e1576109e161081d565b6040528351815260208401516109f6816107eb565b60208201526040840151909250610a0c816107eb565b809150509250929050565b60208082526029908201527f54656c65706f7274657252656769737472793a207a65726f2070726f746f636f6040820152686c206164647265737360b81b606082015260800190565b8082018082111561017757634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + Bin: "0x60a060405234801561000f575f80fd5b50604051610f8c380380610f8c83398101604081905261002e916103e2565b7302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561007e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a291906104bc565b60805280515f5b818110156100e1576100d98382815181106100c6576100c66104d3565b60200260200101516100e960201b60201c565b6001016100a9565b50505061050c565b80515f0361013e5760405162461bcd60e51b815260206004820181905260248201527f54656c65706f7274657252656769737472793a207a65726f2076657273696f6e60448201526064015b60405180910390fd5b80515f908152600160205260409020546001600160a01b0316156101b75760405162461bcd60e51b815260206004820152602a60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20616c72656044820152696164792065786973747360b01b6064820152608401610135565b60208101516001600160a01b03166102235760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472793a207a65726f2070726f746f636f6044820152686c206164647265737360b81b6064820152608401610135565b5f546102316101f4826104e7565b825111156102985760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20696e637260448201526d0cadacadce840e8dede40d0d2ced60931b6064820152608401610135565b6020828101805184515f90815260018452604080822080546001600160a01b0319166001600160a01b03948516179055925190911681526002909252902054825111156102ff5781516020808401516001600160a01b03165f908152600290915260409020555b602082015182516040516001600160a01b03909216917fa5eed93d951a9603d5f7c0a57de79a299dd3dbd5e51429be209d8053a42ab43a905f90a381518110156103725781515f81815560405183917f30623e953733f6474dabdfbef1103ce15ab73cdc77c6dfad0f9874d167e8a9b091a35b5050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156103ac576103ac610376565b60405290565b604051601f8201601f191681016001600160401b03811182821017156103da576103da610376565b604052919050565b5f60208083850312156103f3575f80fd5b82516001600160401b0380821115610409575f80fd5b818501915085601f83011261041c575f80fd5b81518181111561042e5761042e610376565b61043c848260051b016103b2565b818152848101925060069190911b83018401908782111561045b575f80fd5b928401925b818410156104b15760408489031215610477575f80fd5b61047f61038a565b84518152858501516001600160a01b038116811461049b575f80fd5b8187015283526040939093019291840191610460565b979650505050505050565b5f602082840312156104cc575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561050657634e487b7160e01b5f52601160045260245ffd5b92915050565b608051610a6161052b5f395f818161014301526102580152610a615ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063ac473ac311610063578063ac473ac31461011f578063b771b3bc14610128578063c07f47d414610136578063d127dc9b1461013e578063d820e64f14610165575f80fd5b80630731775d1461009f578063215abce9146100c357806341f34ed9146100d657806346f9ef49146100eb5780634c1f08ce146100fe575b5f80fd5b6100a65f81565b6040516001600160a01b0390911681526020015b60405180910390f35b6100a66100d136600461074a565b61016d565b6100e96100e4366004610761565b61017d565b005b6100a66100f936600461074a565b6103ec565b61011161010c3660046107a2565b61047e565b6040519081526020016100ba565b6101116101f481565b6100a66005600160991b0181565b6101115f5481565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6100a6610524565b5f610177826103ec565b92915050565b6040516306f8253560e41b815263ffffffff821660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156101c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101ed919081019061083f565b91509150806102545760405162461bcd60e51b815260206004820152602860248201527f54656c65706f7274657252656769737472793a20696e76616c69642077617270604482015267206d65737361676560c01b60648201526084015b60405180910390fd5b81517f0000000000000000000000000000000000000000000000000000000000000000146102d85760405162461bcd60e51b815260206004820152602b60248201527f54656c65706f7274657252656769737472793a20696e76616c696420736f757260448201526a18d94818da185a5b88125160aa1b606482015260840161024b565b60208201516001600160a01b03161561034d5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472793a20696e76616c6964206f726967604482015270696e2073656e646572206164647265737360781b606482015260840161024b565b5f808360400151806020019051810190610367919061093e565b90925090506001600160a01b03811630146103dc5760405162461bcd60e51b815260206004820152602f60248201527f54656c65706f7274657252656769737472793a20696e76616c6964206465737460448201526e696e6174696f6e206164647265737360881b606482015260840161024b565b6103e582610534565b5050505050565b5f815f0361040c5760405162461bcd60e51b815260040161024b906109b7565b5f828152600160205260409020546001600160a01b0316806101775760405162461bcd60e51b815260206004820152602560248201527f54656c65706f7274657252656769737472793a2076657273696f6e206e6f7420604482015264199bdd5b9960da1b606482015260840161024b565b5f6001600160a01b0382166104a55760405162461bcd60e51b815260040161024b906109ec565b6001600160a01b0382165f90815260026020526040812054908190036101775760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2070726f746f636f6c2061646460448201526d1c995cdcc81b9bdd08199bdd5b9960921b606482015260840161024b565b5f61052f5f546103ec565b905090565b80515f036105545760405162461bcd60e51b815260040161024b906109b7565b80515f908152600160205260409020546001600160a01b0316156105cd5760405162461bcd60e51b815260206004820152602a60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20616c72656044820152696164792065786973747360b01b606482015260840161024b565b60208101516001600160a01b03166105f75760405162461bcd60e51b815260040161024b906109ec565b5f546106056101f482610a35565b8251111561066c5760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20696e637260448201526d0cadacadce840e8dede40d0d2ced60931b606482015260840161024b565b6020828101805184515f90815260018452604080822080546001600160a01b0319166001600160a01b03948516179055925190911681526002909252902054825111156106d35781516020808401516001600160a01b03165f908152600290915260409020555b602082015182516040516001600160a01b03909216917fa5eed93d951a9603d5f7c0a57de79a299dd3dbd5e51429be209d8053a42ab43a905f90a381518110156107465781515f81815560405183917f30623e953733f6474dabdfbef1103ce15ab73cdc77c6dfad0f9874d167e8a9b091a35b5050565b5f6020828403121561075a575f80fd5b5035919050565b5f60208284031215610771575f80fd5b813563ffffffff81168114610784575f80fd5b9392505050565b6001600160a01b038116811461079f575f80fd5b50565b5f602082840312156107b2575f80fd5b81356107848161078b565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156107f4576107f46107bd565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610823576108236107bd565b604052919050565b8051801515811461083a575f80fd5b919050565b5f8060408385031215610850575f80fd5b825167ffffffffffffffff80821115610867575f80fd5b908401906060828703121561087a575f80fd5b6108826107d1565b825181526020808401516108958161078b565b828201526040840151838111156108aa575f80fd5b80850194505087601f8501126108be575f80fd5b8351838111156108d0576108d06107bd565b6108e2601f8201601f191683016107fa565b935080845288828287010111156108f7575f80fd5b5f5b818110156109145785810183015185820184015282016108f9565b505f8282860101525082604083015281955061093181880161082b565b9450505050509250929050565b5f808284036060811215610950575f80fd5b604081121561095d575f80fd5b506040516040810181811067ffffffffffffffff82111715610981576109816107bd565b6040528351815260208401516109968161078b565b602082015260408401519092506109ac8161078b565b809150509250929050565b6020808252818101527f54656c65706f7274657252656769737472793a207a65726f2076657273696f6e604082015260600190565b60208082526029908201527f54656c65706f7274657252656769737472793a207a65726f2070726f746f636f6040820152686c206164647265737360b81b606082015260800190565b8082018082111561017757634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // TeleporterRegistryABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/teleporter/tests/TestMessenger/TestMessenger.go b/abi-bindings/go/teleporter/tests/TestMessenger/TestMessenger.go index 71e916360..9c7aca910 100644 --- a/abi-bindings/go/teleporter/tests/TestMessenger/TestMessenger.go +++ b/abi-bindings/go/teleporter/tests/TestMessenger/TestMessenger.go @@ -32,7 +32,7 @@ var ( // TestMessengerMetaData contains all meta data concerning the TestMessenger contract. var TestMessengerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"teleporterRegistryAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"teleporterManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minTeleporterVersion\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"TELEPORTER_REGISTRY_APP_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentMessage\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinTeleporterVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isTeleporterAddressPaused\",\"inputs\":[{\"name\":\"teleporterAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauseTeleporterAddress\",\"inputs\":[{\"name\":\"teleporterAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"receiveTeleporterMessage\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"originSenderAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"destinationAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requiredGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauseTeleporterAddress\",\"inputs\":[{\"name\":\"teleporterAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateMinTeleporterVersion\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinTeleporterVersionUpdated\",\"inputs\":[{\"name\":\"oldMinTeleporterVersion\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"newMinTeleporterVersion\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReceiveMessage\",\"inputs\":[{\"name\":\"sourceBlockchainID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"originSenderAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"message\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SendMessage\",\"inputs\":[{\"name\":\"destinationBlockchainID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"destinationAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"feeTokenAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"feeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"requiredGasLimit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"message\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TeleporterAddressPaused\",\"inputs\":[{\"name\":\"teleporterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TeleporterAddressUnpaused\",\"inputs\":[{\"name\":\"teleporterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051611ff6380380611ff683398101604081905261002e9161062e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f811580156100775750825b90505f826001600160401b031660011480156100925750303b155b9050811580156100a0575080155b156100be5760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b031916600117855583156100ec57845460ff60401b1916680100000000000000001785555b6100f4610152565b6100ff888888610164565b831561014557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505061067e565b61015a610184565b6101626101d2565b565b61016c610184565b6101768382610200565b61017f82610226565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661016257604051631afcd79f60e31b815260040160405180910390fd5b6101da610184565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610208610184565b610210610152565b61021861023a565b6102228282610242565b5050565b61022e610184565b610237816103d1565b50565b610162610184565b61024a610184565b6001600160a01b0382166102cb5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084015b60405180910390fd5b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610330573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103549190610667565b116103a95760405162461bcd60e51b815260206004820152603260248201525f80516020611fd6833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016102c2565b81546001600160a01b0319166001600160a01b0382161782556103cb8361040b565b50505050565b6103d9610184565b6001600160a01b03811661040257604051631e4fbdf760e01b81525f60048201526024016102c2565b610237816105a3565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610472573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104969190610667565b6002830154909150818411156104f55760405162461bcd60e51b815260206004820152603160248201525f80516020611fd683398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016102c2565b80841161056a5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016102c2565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b0381168114610629575f80fd5b919050565b5f805f60608486031215610640575f80fd5b61064984610613565b925061065760208501610613565b9150604084015190509250925092565b5f60208284031215610677575f80fd5b5051919050565b61194b8061068b5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063973142971161006e5780639731429714610159578063b33fead41461017c578063c868efaa1461019d578063d2cc7a70146101b0578063f2fde38b146101d7578063f63d09d7146101ea575f80fd5b80632b0d8f18146100b55780634511243e146100ca5780635eb99514146100dd578063715018a6146100f05780638da5cb5b146100f8578063909a6ac014610137575b5f80fd5b6100c86100c3366004611335565b6101fd565b005b6100c86100d8366004611335565b6102ff565b6100c86100eb366004611350565b6103ee565b6100c8610402565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020015b60405180910390f35b61014b5f8051602061191f83398151915281565b60405190815260200161012e565b61016c610167366004611335565b610415565b604051901515815260200161012e565b61018f61018a366004611350565b610435565b60405161012e9291906113b4565b6100c86101ab366004611424565b610507565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d025461014b565b6100c86101e5366004611335565b6106e5565b61014b6101f836600461147c565b61071f565b5f8051602061191f83398151915261021361087b565b6001600160a01b0382166102425760405162461bcd60e51b8152600401610239906114fc565b60405180910390fd5b61024c8183610883565b156102af5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610239565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f8051602061191f83398151915261031561087b565b6001600160a01b03821661033b5760405162461bcd60e51b8152600401610239906114fc565b6103458183610883565b6103a35760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610239565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6103f661087b565b6103ff816108a7565b50565b61040a610a3f565b6104135f610a9a565b565b5f5f8051602061191f83398151915261042e8184610883565b9392505050565b5f81815260208181526040808320815180830190925280546001600160a01b0316825260018101805460609486949392908401916104729061154a565b80601f016020809104026020016040519081016040528092919081815260200182805461049e9061154a565b80156104e95780601f106104c0576101008083540402835291602001916104e9565b820191905f5260205f20905b8154815290600101906020018083116104cc57829003601f168201915b5050505050815250509050805f015181602001519250925050915091565b61050f610b0a565b5f5f8051602061191f83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561057a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059e9190611582565b10156106055760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610239565b61060f8133610883565b156106755760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610239565b6106b5858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610b5492505050565b506106df60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050565b6106ed610a3f565b6001600160a01b03811661071657604051631e4fbdf760e01b81525f6004820152602401610239565b6103ff81610a9a565b5f610728610b0a565b5f851561073c576107398787610c09565b90505b876001600160a01b0316897fa06eff1edd0c66b8dc96d086dda7ba263edf88d7417e6cb15073b5e7bff8a8ca898489898960405161077e9594939291906115c1565b60405180910390a36108446040518060c001604052808b81526020018a6001600160a01b0316815260200160405180604001604052808b6001600160a01b031681526020018581525081526020018781526020015f67ffffffffffffffff8111156107eb576107eb6115ee565b604051908082528060200260200182016040528015610814578160200160208202803683370190505b508152602001868660405160200161082d929190611602565b604051602081830303815290604052815250610d6b565b91505061087060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b979650505050505050565b610413610a3f565b6001600160a01b0381165f90815260018301602052604090205460ff165b92915050565b5f8051602061191f83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa1580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f9190611582565b6002830154909150818411156109915760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610239565b808411610a065760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610239565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b33610a717f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104135760405163118cdaa760e01b8152336004820152602401610239565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610b4e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f81806020019051810190610b699190611615565b6040805180820182526001600160a01b03868116825260208083018581525f8a815291829052939020825181546001600160a01b03191692169190911781559151929350916001820190610bbd90826116fd565b50905050826001600160a01b0316847f1f5c800b5f2b573929a7948f82a199c2a212851b53a6c5bd703ece23999d24aa83604051610bfb91906117bd565b60405180910390a350505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c739190611582565b9050610c8a6001600160a01b038516333086610e86565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610cce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf29190611582565b9050818111610d585760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610239565b610d6282826117e3565b95945050505050565b5f80610d75610eed565b60408401516020015190915015610e1a576040830151516001600160a01b0316610df75760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610239565b604083015160208101519051610e1a916001600160a01b03909116908390610fdd565b604051630624488560e41b81526001600160a01b03821690636244885090610e46908690600401611839565b6020604051808303815f875af1158015610e62573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061042e9190611582565b6040516001600160a01b0384811660248301528381166044830152606482018390526106df9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611064565b5f8051602061191f83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015610f47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6b91906118b6565b9050610f778282610883565b156108a15760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610239565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa15801561102a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104e9190611582565b90506106df848461105f85856118d1565b6110ca565b5f6110786001600160a01b03841683611159565b905080515f1415801561109c57508080602001905181019061109a91906118e4565b155b156110c557604051635274afe760e01b81526001600160a01b0384166004820152602401610239565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261111b8482611166565b6106df576040516001600160a01b0384811660248301525f604483015261114f91869182169063095ea7b390606401610ebb565b6106df8482611064565b606061042e83835f611203565b5f805f846001600160a01b0316846040516111819190611903565b5f604051808303815f865af19150503d805f81146111ba576040519150601f19603f3d011682016040523d82523d5f602084013e6111bf565b606091505b50915091508180156111e95750805115806111e95750808060200190518101906111e991906118e4565b8015610d625750505050506001600160a01b03163b151590565b6060814710156112285760405163cd78605960e01b8152306004820152602401610239565b5f80856001600160a01b031684866040516112439190611903565b5f6040518083038185875af1925050503d805f811461127d576040519150601f19603f3d011682016040523d82523d5f602084013e611282565b606091505b509150915061129286838361129c565b9695505050505050565b6060826112b1576112ac826112f8565b61042e565b81511580156112c857506001600160a01b0384163b155b156112f157604051639996b31560e01b81526001600160a01b0385166004820152602401610239565b508061042e565b8051156113085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b03811681146103ff575f80fd5b5f60208284031215611345575f80fd5b813561042e81611321565b5f60208284031215611360575f80fd5b5035919050565b5f5b83811015611381578181015183820152602001611369565b50505f910152565b5f81518084526113a0816020860160208601611367565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190525f906113d790830184611389565b949350505050565b5f8083601f8401126113ef575f80fd5b50813567ffffffffffffffff811115611406575f80fd5b60208301915083602082850101111561141d575f80fd5b9250929050565b5f805f8060608587031215611437575f80fd5b84359350602085013561144981611321565b9250604085013567ffffffffffffffff811115611464575f80fd5b611470878288016113df565b95989497509550505050565b5f805f805f805f60c0888a031215611492575f80fd5b8735965060208801356114a481611321565b955060408801356114b481611321565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156114dd575f80fd5b6114e98a828b016113df565b989b979a50959850939692959293505050565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b600181811c9082168061155e57607f821691505b60208210810361157c57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215611592575f80fd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0386168152846020820152836040820152608060608201525f610870608083018486611599565b634e487b7160e01b5f52604160045260245ffd5b602081525f6113d7602083018486611599565b5f60208284031215611625575f80fd5b815167ffffffffffffffff8082111561163c575f80fd5b818401915084601f83011261164f575f80fd5b815181811115611661576116616115ee565b604051601f8201601f19908116603f01168101908382118183101715611689576116896115ee565b816040528281528760208487010111156116a1575f80fd5b610870836020830160208801611367565b601f8211156110c557805f5260205f20601f840160051c810160208510156116d75750805b601f840160051c820191505b818110156116f6575f81556001016116e3565b5050505050565b815167ffffffffffffffff811115611717576117176115ee565b61172b81611725845461154a565b846116b2565b602080601f83116001811461175e575f84156117475750858301515b5f19600386901b1c1916600185901b1785556117b5565b5f85815260208120601f198616915b8281101561178c5788860151825594840194600190910190840161176d565b50858210156117a957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f61042e6020830184611389565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108a1576108a16117cf565b5f815180845260208085019450602084015f5b8381101561182e5781516001600160a01b031687529582019590820190600101611809565b509495945050505050565b60208152815160208201525f602083015160018060a01b03808216604085015260408501519150808251166060850152506020810151608084015250606083015160a0830152608083015160e060c08401526118996101008401826117f6565b905060a0840151601f198483030160e0850152610d628282611389565b5f602082840312156118c6575f80fd5b815161042e81611321565b808201808211156108a1576108a16117cf565b5f602082840312156118f4575f80fd5b8151801515811461042e575f80fd5b5f8251611914818460208701611367565b919091019291505056fede77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a164736f6c6343000819000a54656c65706f7274657252656769737472794170703a20696e76616c69642054", + Bin: "0x608060405234801561000f575f80fd5b50604051611fca380380611fca83398101604081905261002e9161062e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f811580156100775750825b90505f826001600160401b031660011480156100925750303b155b9050811580156100a0575080155b156100be5760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b031916600117855583156100ec57845460ff60401b1916680100000000000000001785555b6100f4610152565b6100ff888888610164565b831561014557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505061067e565b61015a610184565b6101626101d2565b565b61016c610184565b6101768382610200565b61017f82610226565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661016257604051631afcd79f60e31b815260040160405180910390fd5b6101da610184565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610208610184565b610210610152565b61021861023a565b6102228282610242565b5050565b61022e610184565b610237816103d1565b50565b610162610184565b61024a610184565b6001600160a01b0382166102cb5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084015b60405180910390fd5b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610330573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103549190610667565b116103a95760405162461bcd60e51b815260206004820152603260248201525f80516020611faa833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016102c2565b81546001600160a01b0319166001600160a01b0382161782556103cb8361040b565b50505050565b6103d9610184565b6001600160a01b03811661040257604051631e4fbdf760e01b81525f60048201526024016102c2565b610237816105a3565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610472573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104969190610667565b6002830154909150818411156104f55760405162461bcd60e51b815260206004820152603160248201525f80516020611faa83398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016102c2565b80841161056a5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016102c2565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b0381168114610629575f80fd5b919050565b5f805f60608486031215610640575f80fd5b61064984610613565b925061065760208501610613565b9150604084015190509250925092565b5f60208284031215610677575f80fd5b5051919050565b61191f8061068b5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063973142971161006e578063973142971461014b578063b33fead41461016e578063c868efaa1461018f578063d2cc7a70146101a2578063f2fde38b146101aa578063f63d09d7146101bd575f80fd5b80632b0d8f18146100b55780634511243e146100ca5780635eb99514146100dd578063715018a6146100f05780638da5cb5b146100f8578063909a6ac014610116575b5f80fd5b6100c86100c33660046112f5565b6101d0565b005b6100c86100d83660046112f5565b6102cf565b6100c86100eb366004611310565b6103bb565b6100c86103cf565b6101006103e2565b60405161010d9190611327565b60405180910390f35b61013d7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0081565b60405190815260200161010d565b61015e6101593660046112f5565b610410565b604051901515815260200161010d565b61018161017c366004611310565b61042d565b60405161010d929190611388565b6100c861019d3660046113f8565b6104ff565b61013d6106b9565b6100c86101b83660046112f5565b6106cd565b61013d6101cb366004611450565b610707565b5f6101d9610850565b90506101e3610874565b6001600160a01b0382166102125760405162461bcd60e51b8152600401610209906114d0565b60405180910390fd5b61021c818361087c565b1561027f5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610209565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f6102d8610850565b90506102e2610874565b6001600160a01b0382166103085760405162461bcd60e51b8152600401610209906114d0565b610312818361087c565b6103705760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610209565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6103c3610874565b6103cc816108a0565b50565b6103d7610a41565b6103e05f610a73565b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b5f8061041a610850565b9050610426818461087c565b9392505050565b5f81815260208181526040808320815180830190925280546001600160a01b03168252600181018054606094869493929084019161046a9061151e565b80601f01602080910402602001604051908101604052809291908181526020018280546104969061151e565b80156104e15780601f106104b8576101008083540402835291602001916104e1565b820191905f5260205f20905b8154815290600101906020018083116104c457829003601f168201915b5050505050815250509050805f015181602001519250925050915091565b610507610ae3565b5f610510610850565b60028101548154919250906001600160a01b0316634c1f08ce336040518263ffffffff1660e01b81526004016105469190611327565b602060405180830381865afa158015610561573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105859190611556565b10156105ec5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610209565b6105f6813361087c565b1561065c5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610209565b61069c858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610b1a92505050565b506106b360015f805160206118f383398151915255565b50505050565b5f806106c3610850565b6002015492915050565b6106d5610a41565b6001600160a01b0381166106fe575f604051631e4fbdf760e01b81526004016102099190611327565b6103cc81610a73565b5f610710610ae3565b5f8515610724576107218787610bcf565b90505b876001600160a01b0316897fa06eff1edd0c66b8dc96d086dda7ba263edf88d7417e6cb15073b5e7bff8a8ca8984898989604051610766959493929190611595565b60405180910390a361082c6040518060c001604052808b81526020018a6001600160a01b0316815260200160405180604001604052808b6001600160a01b031681526020018581525081526020018781526020015f67ffffffffffffffff8111156107d3576107d36115c2565b6040519080825280602002602001820160405280156107fc578160200160208202803683370190505b50815260200186866040516020016108159291906115d6565b604051602081830303815290604052815250610d39565b91505061084560015f805160206118f383398151915255565b979650505050505050565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090565b6103e0610a41565b6001600160a01b0381165f90815260018301602052604090205460ff165b92915050565b5f6108a9610850565b90505f815f015f9054906101000a90046001600160a01b03166001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109219190611556565b6002830154909150818411156109935760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610209565b808411610a085760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610209565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b33610a4a6103e2565b6001600160a01b0316146103e0573360405163118cdaa760e01b81526004016102099190611327565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f805160206118f3833981519152805460011901610b1457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f81806020019051810190610b2f91906115e9565b6040805180820182526001600160a01b03868116825260208083018581525f8a815291829052939020825181546001600160a01b03191692169190911781559151929350916001820190610b8390826116d1565b50905050826001600160a01b0316847f1f5c800b5f2b573929a7948f82a199c2a212851b53a6c5bd703ece23999d24aa83604051610bc19190611791565b60405180910390a350505050565b5f80836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610bfd9190611327565b602060405180830381865afa158015610c18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3c9190611556565b9050610c536001600160a01b038516333086610e54565b6040516370a0823160e01b81525f906001600160a01b038616906370a0823190610c81903090600401611327565b602060405180830381865afa158015610c9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc09190611556565b9050818111610d265760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610209565b610d3082826117b7565b95945050505050565b5f80610d43610ebb565b60408401516020015190915015610de8576040830151516001600160a01b0316610dc55760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610209565b604083015160208101519051610de8916001600160a01b03909116908390610faf565b604051630624488560e41b81526001600160a01b03821690636244885090610e1490869060040161180d565b6020604051808303815f875af1158015610e30573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104269190611556565b6040516001600160a01b0384811660248301528381166044830152606482018390526106b39186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611036565b5f80610ec5610850565b90505f815f015f9054906101000a90046001600160a01b03166001600160a01b031663d820e64f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3d919061188a565b9050610f49828261087c565b1561089a5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610209565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015610ffc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110209190611556565b90506106b3848461103185856118a5565b611093565b5f61104a6001600160a01b03841683611122565b905080515f1415801561106e57508080602001905181019061106c91906118b8565b155b1561108e5782604051635274afe760e01b81526004016102099190611327565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526110e4848261112f565b6106b3576040516001600160a01b0384811660248301525f604483015261111891869182169063095ea7b390606401610e89565b6106b38482611036565b606061042683835f6111cc565b5f805f846001600160a01b03168460405161114a91906118d7565b5f604051808303815f865af19150503d805f8114611183576040519150601f19603f3d011682016040523d82523d5f602084013e611188565b606091505b50915091508180156111b25750805115806111b25750808060200190518101906111b291906118b8565b8015610d305750505050506001600160a01b03163b151590565b6060814710156111f1573060405163cd78605960e01b81526004016102099190611327565b5f80856001600160a01b0316848660405161120c91906118d7565b5f6040518083038185875af1925050503d805f8114611246576040519150601f19603f3d011682016040523d82523d5f602084013e61124b565b606091505b509150915061125b868383611265565b9695505050505050565b60608261127a57611275826112b8565b610426565b815115801561129157506001600160a01b0384163b155b156112b15783604051639996b31560e01b81526004016102099190611327565b5080610426565b8051156112c85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b03811681146103cc575f80fd5b5f60208284031215611305575f80fd5b8135610426816112e1565b5f60208284031215611320575f80fd5b5035919050565b6001600160a01b0391909116815260200190565b5f5b8381101561135557818101518382015260200161133d565b50505f910152565b5f815180845261137481602086016020860161133b565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190525f906113ab9083018461135d565b949350505050565b5f8083601f8401126113c3575f80fd5b50813567ffffffffffffffff8111156113da575f80fd5b6020830191508360208285010111156113f1575f80fd5b9250929050565b5f805f806060858703121561140b575f80fd5b84359350602085013561141d816112e1565b9250604085013567ffffffffffffffff811115611438575f80fd5b611444878288016113b3565b95989497509550505050565b5f805f805f805f60c0888a031215611466575f80fd5b873596506020880135611478816112e1565b95506040880135611488816112e1565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156114b1575f80fd5b6114bd8a828b016113b3565b989b979a50959850939692959293505050565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b600181811c9082168061153257607f821691505b60208210810361155057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215611566575f80fd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0386168152846020820152836040820152608060608201525f61084560808301848661156d565b634e487b7160e01b5f52604160045260245ffd5b602081525f6113ab60208301848661156d565b5f602082840312156115f9575f80fd5b815167ffffffffffffffff80821115611610575f80fd5b818401915084601f830112611623575f80fd5b815181811115611635576116356115c2565b604051601f8201601f19908116603f0116810190838211818310171561165d5761165d6115c2565b81604052828152876020848701011115611675575f80fd5b61084583602083016020880161133b565b601f82111561108e57805f5260205f20601f840160051c810160208510156116ab5750805b601f840160051c820191505b818110156116ca575f81556001016116b7565b5050505050565b815167ffffffffffffffff8111156116eb576116eb6115c2565b6116ff816116f9845461151e565b84611686565b602080601f831160018114611732575f841561171b5750858301515b5f19600386901b1c1916600185901b178555611789565b5f85815260208120601f198616915b8281101561176057888601518255948401946001909101908401611741565b508582101561177d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f610426602083018461135d565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561089a5761089a6117a3565b5f815180845260208085019450602084015f5b838110156118025781516001600160a01b0316875295820195908201906001016117dd565b509495945050505050565b60208152815160208201525f602083015160018060a01b03808216604085015260408501519150808251166060850152506020810151608084015250606083015160a0830152608083015160e060c084015261186d6101008401826117ca565b905060a0840151601f198483030160e0850152610d30828261135d565b5f6020828403121561189a575f80fd5b8151610426816112e1565b8082018082111561089a5761089a6117a3565b5f602082840312156118c8575f80fd5b81518015158114610426575f80fd5b5f82516118e881846020870161133b565b919091019291505056fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a54656c65706f7274657252656769737472794170703a20696e76616c69642054", } // TestMessengerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 11f98bc63..513f1beee 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516161ac3803806161ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61605f8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f36600461527d565b6104b3565b005b6102146102243660046152b8565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b61021461025636600461527d565b6106f6565b6102146102693660046152cf565b610701565b61021461027c36600461531d565b610c2b565b61029461028f3660046152b8565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d636600461527d565b610cf9565b6102146102e936600461533e565b610d04565b6103016102fc36600461537e565b610dc5565b60405190815260200161023f565b61021461031d3660046153e3565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461540b565b611065565b6102946103603660046152b8565b61109c565b6103015f81565b61021461037a36600461527d565b6110b0565b610231603081565b6102146103953660046152b8565b6110db565b6102146103a83660046153e3565b6111a6565b6103016103bb366004615424565b61137e565b6102146103ce36600461533e565b6113aa565b6103015f80516020615fb383398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b3660046152b8565b611533565b6103015f80516020615fd383398151915281565b6102146104423660046152b8565b61171c565b610231601481565b61046261045d3660046152b8565b611859565b60405161023f91906154b9565b6102946202a30081565b6103015f80516020615f9383398151915281565b61021461049b36600461554d565b6119a8565b6103016104ae36600461558b565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160338339815191526020526040808220815160e0810190925280545f80516020615fd383398151915293929190829060ff16600581111561053557610535615444565b600581111561054657610546615444565b815260200160018201805461055a906155f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906155f6565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615444565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562e565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e3a565b6040518263ffffffff1660e01b81526004016106b0919061563c565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061564e565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615fd38339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba919061564e565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615665565b6001600160a01b031614610837576108126060840160408501615665565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615680565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615680565b8363ffffffff1681811061087e5761087e6156c5565b905060200281019061089091906156d9565b610899906157fd565b80516040519192505f9160088801916108b191615876565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da919060040161563c565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615876565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610968919061564e565b90508086600801835f01516040516109809190615876565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615444565b021790555060208201516001820190610a1b90826158cb565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561599a565b8251604051919550610ad191615876565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906159ad565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836159cf565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e89565b60400151611f9f565b90505f610b958761212c565b90505f600282604051610ba89190615876565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be6919061564e565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612306565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c75615444565b14610c95578060405163170cc93360e21b81526004016104da919061562e565b6106f08383612341565b5f805f80516020615fb383398151915260030154610cbd90846159e6565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f08383836125bb565b610d0c6127a7565b5f80516020615fb38339815191525f80610d25846127de565b91509150610d3282612306565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c615444565b03610d91575f83815260088501602052604081208054919055610d8f8282612b1c565b505b610da781610da28460400151611065565b612b92565b505050505b610dc260015f8051602061601383398151915255565b50565b5f610dce6127a7565b610dda85858585612bc8565b9050610df260015f8051602061601383398151915255565b949350505050565b5f8181525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb383398151915293929190829060ff166003811115610e4757610e47615444565b6003811115610e5857610e58615444565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee5615444565b14610f06578251604051633b0d540d60e21b81526104da9190600401615a05565b600481516005811115610f1b57610f1b615444565b03610f3157610f2985612da1565b505050505050565b5f80610f48610f3f89611e89565b60400151612ff5565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b0384166159cf565b5f6110a682611859565b6080015192915050565b6110bb8383836125bb565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615fb38339815191525f6110f383611859565b519050600481600581111561110a5761110a615444565b1461112a578060405163170cc93360e21b81526004016104da919061562e565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612b1c565b6111ae6127a7565b5f8181525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb383398151915293929190829060ff1660038111156111fb576111fb615444565b600381111561120c5761120c615444565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128557611285615444565b146112a6578051604051633b0d540d60e21b81526104da9190600401615a05565b60046112b58260400151611859565b5160058111156112c7576112c7615444565b14611359575f6112d685611e89565b90505f806112e78360400151612ff5565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612da1565b505061137a60015f8051602061601383398151915255565b5050565b5f6113876127a7565b61139283338461324b565b9050610cf360015f8051602061601383398151915255565b5f80516020615fd38339815191525f806113cf6113c685611e89565b60400151613523565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f906155f6565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff16600581111561145957611459615444565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562e565b5f82815260068401602052604081206114a4916151cc565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb383398151915293929190829060ff16600381111561158057611580615444565b600381111561159157611591615444565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a615444565b1415801561162b575060038151600381111561162857611628615444565b14155b1561164c578051604051633b0d540d60e21b81526104da9190600401615a05565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611e3a565b6040518263ffffffff1660e01b81526004016116d5919061563c565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611715919061564e565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615fd38339815191529190611763906155f6565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad615444565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118199190600401615a1f565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e3919061564e565b611861615203565b5f8281525f80516020616033833981519152602052604090819020815160e0810190925280545f80516020615fd3833981519152929190829060ff1660058111156118ae576118ae615444565b60058111156118bf576118bf615444565b81526020016001820180546118d3906155f6565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff906155f6565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a84846136df565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615fd3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca9086908690615aa9565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb38339815191529284929091829060ff166003811115611b3057611b30615444565b6003811115611b4157611b41615444565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce615444565b14611bef578251604051633b0d540d60e21b81526104da9190600401615a05565b60208301516001600160a01b03163314611c8b575f8281526005850160205260409020546001600160a01b03163314611c28573361114b565b5f82815260058501602052604090205460a0820151611c5791600160b01b90046001600160401b031690615ab8565b6001600160401b0316421015611c8b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca057611ca0615444565b03611dce5760028401546080840151611cc2916001600160401b031690615ab8565b6001600160401b0316421015611cf65760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d0857611d068287612341565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d41918491611d3c9190615ad8565b6136f9565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d8284613850565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e339350505050565b600481516005811115611de357611de3615444565b03611e1757611df183613850565b5f898152600786016020526040902055611e0a88612da1565b6001945050505050611e33565b805160405163170cc93360e21b81526104da919060040161562e565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611eed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f149190810190615b03565b9150915080611f3657604051636b2f19e960e01b815260040160405180910390fd5b815115611f5c578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f98576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fd457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202357611feb816001615bd5565b611ff69060086159cf565b61ffff1684828151811061200c5761200c6156c5565b016020015160f81c901b9190911790600101611fd7565b5061ffff81161561204d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120a857612064816003615bd5565b61206f9060086159cf565b63ffffffff168561208183600261599a565b81518110612091576120916156c5565b016020015160f81c901b9190911790600101612050565b5063ffffffff8116156120ce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612123576120e581601f615bd5565b6120f09060086159cf565b866120fc83600661599a565b8151811061210c5761210c6156c5565b016020015160f81c901b91909117906001016120d1565b50949350505050565b60605f8083356020850135601461214887870160408901615665565b6121556060890189615680565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121db6060850185615680565b9050811015611f9857816121f26060860186615680565b83818110612202576122026156c5565b905060200281019061221491906156d9565b61221e9080615be8565b905061222d6060870187615680565b8481811061223d5761223d6156c5565b905060200281019061224f91906156d9565b6122599080615be8565b6122666060890189615680565b86818110612276576122766156c5565b905060200281019061228891906156d9565b612296906020810190615be8565b6122a360608b018b615680565b888181106122b3576122b36156c5565b90506020028101906122c591906156d9565b6122d690606081019060400161540b565b6040516020016122ec9796959493929190615c2a565b60408051601f1981840301815291905291506001016121ce565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561238c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123b39190810190615b03565b91509150806123d557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243c919061564e565b825114612462578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561249e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f806124ad84604001516139ed565b915091508187146124d45760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615fb3833981519152906001600160401b039081169083161115612591575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125b0565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615fb3833981519152816125d486613bde565b90506125df86612306565b6125ee57600192505050611e33565b5f8681526005830160205260409020546001600160a01b03163314612613573361114b565b5f86815260058301602052604090205460a082015161264291600160b01b90046001600160401b031690615ab8565b6001600160401b03168160c001516001600160401b031610156126895760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126a15761269a8786612341565b90506126bf565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126e490611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561274d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612771919061564e565b905080846008015f8a81526020019081526020015f205f828254612795919061599a565b90915550501515979650505050505050565b5f805160206160138339815191528054600119016127d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e7615203565b5f80516020615fd38339815191525f806128036113c687611e89565b91509150801561282a57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285b5761285b615444565b600581111561286c5761286c615444565b8152602001600182018054612880906155f6565b80601f01602080910402602001604051908101604052809291908181526020018280546128ac906155f6565b80156128f75780601f106128ce576101008083540402835291602001916128f7565b820191905f5260205f20905b8154815290600101906020018083116128da57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561296257612962615444565b14158015612983575060018151600581111561298057612980615444565b14155b156129a457805160405163170cc93360e21b81526104da919060040161562e565b6003815160058111156129b9576129b9615444565b036129c757600481526129cc565b600581525b8360080181602001516040516129e29190615876565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2657612a26615444565b021790555060208201516001820190612a3f90826158cb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae557612ae5615444565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615f9383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b77575f80fd5b505af1158015612b89573d5f803e3d5ffd5b50505050505050565b5f80516020615f938339815191525461137a906001600160a01b03168383613ec2565b60015f8051602061601383398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615fb383398151915290600160401b900461ffff9081169086161080612c1c575061271061ffff8616115b15612c4057604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c7c576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c8e5750806001015483115b15612caf5760405163222d164360e21b8152600481018490526024016104da565b5f612cb984613f21565b90505f612cc582610c9f565b90505f612cd28983613f44565b90506040518060800160405280612ce63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ff38339815191526020526040808220815160e0810190925280545f80516020615fb383398151915293929190829060ff166003811115612dee57612dee615444565b6003811115612dff57612dff615444565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612e9c7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b8260800151612eab9190615ab8565b6001600160401b0316421015612edf5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b5f848152600684016020908152604080832080546001600160a81b03191681556001810184905560020183905560078601909152812080549082905590808215612f9a575f84815260058701602052604090205461271090612f4c90600160a01b900461ffff16856159cf565b612f5691906159e6565b915081866008015f8681526020019081526020015f205f828254612f7a919061599a565b90915550612f8a90508284615bd5565b9050612f9a856020015182612b1c565b612faf8560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f835160361461302c57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b600281101561307b57613043816001615bd5565b61304e9060086159cf565b61ffff16868281518110613064576130646156c5565b016020015160f81c901b919091179060010161302f565b5061ffff8116156130a55760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613100576130bc816003615bd5565b6130c79060086159cf565b63ffffffff16876130d983600261599a565b815181106130e9576130e96156c5565b016020015160f81c901b91909117906001016130a8565b5063ffffffff811660031461312857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561317d5761313f81601f615bd5565b61314a9060086159cf565b8861315683600661599a565b81518110613166576131666156c5565b016020015160f81c901b919091179060010161312b565b505f805b60088110156131dc57613195816007615bd5565b6131a09060086159cf565b6001600160401b0316896131b583602661599a565b815181106131c5576131c56156c5565b016020015160f81c901b9190911790600101613181565b505f805b600881101561323b576131f4816007615bd5565b6131ff9060086159cf565b6001600160401b03168a61321483602e61599a565b81518110613224576132246156c5565b016020015160f81c901b91909117906001016131e0565b5091989097509095509350505050565b5f5f80516020615fb38339815191528161326761028f85613f21565b90505f61327387611859565b905061327e87612306565b61329e576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156132b3576132b3615444565b146132d457805160405163170cc93360e21b81526104da919060040161562e565b5f8282608001516132e59190615ab8565b905083600201600a9054906101000a90046001600160401b0316826040015161330e9190615c93565b6001600160401b0316816001600160401b0316111561334b57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806133578a846136f9565b915091505f8a8360405160200161338592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561341857613418615444565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461355957825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156135a857613570816001615bd5565b61357b9060086159cf565b61ffff16858281518110613591576135916156c5565b016020015160f81c901b919091179060010161355c565b5061ffff8116156135d25760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b600481101561362d576135e9816003615bd5565b6135f49060086159cf565b63ffffffff168661360683600261599a565b81518110613616576136166156c5565b016020015160f81c901b91909117906001016135d5565b5063ffffffff811660021461365557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156136aa5761366c81601f615bd5565b6136779060086159cf565b8761368383600661599a565b81518110613693576136936156c5565b016020015160f81c901b9190911790600101613658565b505f866026815181106136bf576136bf6156c5565b016020015191976001600160f81b03199092161515965090945050505050565b6136e76144bc565b6136f082614507565b61137a8161457b565b5f8281525f80516020616033833981519152602052604081206002015481905f80516020615fd383398151915290600160801b90046001600160401b031661374185826145e3565b5f61374b87614806565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61379b8a858b611e3a565b6040518263ffffffff1660e01b81526004016137b7919061563c565b6020604051808303815f875af11580156137d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137f7919061564e565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615fb383398151915290505f6138708460400151611859565b90505f60038251600581111561388857613888615444565b14806138a657506004825160058111156138a4576138a4615444565b145b156138b6575060c08101516138f3565b6002825160058111156138cb576138cb615444565b036138d75750426138f3565b815160405163170cc93360e21b81526104da919060040161562e565b84608001516001600160401b0316816001600160401b03161161391a57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061393f90611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156139c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139e4919061564e565b95945050505050565b5f808251602e14613a2357825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613a7257613a3a816001615bd5565b613a459060086159cf565b61ffff16858281518110613a5b57613a5b6156c5565b016020015160f81c901b9190911790600101613a26565b5061ffff811615613a9c5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613af757613ab3816003615bd5565b613abe9060086159cf565b63ffffffff1686613ad083600261599a565b81518110613ae057613ae06156c5565b016020015160f81c901b9190911790600101613a9f565b5063ffffffff811615613b1d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7257613b3481601f615bd5565b613b3f9060086159cf565b87613b4b83600661599a565b81518110613b5b57613b5b6156c5565b016020015160f81c901b9190911790600101613b20565b505f805b6008811015613bd157613b8a816007615bd5565b613b959060086159cf565b6001600160401b031688613baa83602661599a565b81518110613bba57613bba6156c5565b016020015160f81c901b9190911790600101613b76565b5090969095509350505050565b613be6615203565b5f8281525f805160206160338339815191526020526040808220815160e0810190925280545f80516020615fd383398151915293929190829060ff166005811115613c3357613c33615444565b6005811115613c4457613c44615444565b8152602001600182018054613c58906155f6565b80601f0160208091040260200160405190810160405280929190818152602001828054613c84906155f6565b8015613ccf5780601f10613ca657610100808354040283529160200191613ccf565b820191905f5260205f20905b815481529060010190602001808311613cb257829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d3d57613d3d615444565b14613d70575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161562e565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613db457613db4615444565b021790555060208201516001820190613dcd90826158cb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e6b85826136f9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061487b565b5f610cf3825f80516020615f93833981519152546001600160a01b0316906148dc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f8857604051637fab81e560e01b815260040160405180910390fd5b5f80516020615fd383398151915242613fa7606086016040870161540b565b6001600160401b0316111580613fe15750613fc56202a3004261599a565b613fd5606086016040870161540b565b6001600160401b031610155b1561401b57613ff6606085016040860161540b565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b61403061402b6060860186615cbe565b614a35565b61404061402b6080860186615cbe565b603061404f6020860186615be8565b905014614081576140636020850185615be8565b6040516326475b2f60e11b81526104da925060040190815260200190565b61408b8480615be8565b90505f036140b85761409d8480615be8565b604051633e08a12560e11b81526004016104da929190615cd2565b5f600882016140c78680615be8565b6040516140d5929190615aa9565b9081526020016040518091039020541461410e576140f38480615be8565b60405163a41f772f60e01b81526004016104da929190615cd2565b614118835f6145e3565b6040805160e08101909152815481525f908190614224906020810161413d8980615be8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614185908a018a615be8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141ce60608a0160408b0161540b565b6001600160401b031681526020016141e960608a018a615cbe565b6141f290615d00565b815260200161420460808a018a615cbe565b61420d90615d00565b8152602001876001600160401b0316815250614b9e565b5f8281526006860160205260409020919350915061424282826158cb565b5081600884016142528880615be8565b604051614260929190615aa9565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061429c90859060040161563c565b6020604051808303815f875af11580156142b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142dc919061564e565b6040805160e0810190915290915080600181526020016142fc8980615be8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561438b5761438b615444565b0217905550602082015160018201906143a490826158cb565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144428880615be8565b604051614450929190615aa9565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061448e919061540b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661450557604051631afcd79f60e31b815260040160405180910390fd5b565b61450f6144bc565b61451881614d8b565b614520614da4565b610dc26060820135608083013561453d60c0850160a0860161540b565b61454d60e0860160c08701615dc7565b61455e610100870160e08801615de0565b61010087013561457661014089016101208a01615665565b614db4565b6145836144bc565b5f80516020615f938339815191526001600160a01b0382166145c357604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615fd38339815191525f6001600160401b038084169085161115614617576146108385615ad8565b9050614624565b6146218484615ad8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614686575060018401548151614682916001600160401b03169061599a565b8210155b156146ac576001600160401b0383166060820152818152604081015160208201526146cb565b82816060018181516146be9190615ab8565b6001600160401b03169052505b60608101516146db906064615c93565b602082015160018601546001600160401b0392909216916147069190600160401b900460ff166159cf565b101561473657606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b031681604001818151614751919061599a565b9052506040810180516001600160401b0387169190614771908390615bd5565b9052506001840154604082015160649161479691600160401b90910460ff16906159cf565b10156147bd578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160338339815191526020526040812060020180545f80516020615fd3833981519152919060089061485090600160401b90046001600160401b0316615e00565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61488f6001600160a01b03841683614f70565b905080515f141580156148b35750808060200190518101906148b19190615e1b565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614922573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614946919061564e565b905061495d6001600160a01b038516333086614f7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156149a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149c5919061564e565b9050818111614a2b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139e48282615bd5565b614a42602082018261533e565b63ffffffff16158015614a625750614a5d6020820182615680565b151590505b15614aa957614a74602082018261533e565b614a816020830183615680565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614ab66020820182615680565b9050614ac5602083018361533e565b63ffffffff161115614ade57614a74602082018261533e565b60015b614aee6020830183615680565b905081101561137a57614b046020830183615680565b614b0f600184615bd5565b818110614b1e57614b1e6156c5565b9050602002016020810190614b339190615665565b6001600160a01b0316614b496020840184615680565b83818110614b5957614b596156c5565b9050602002016020810190614b6e9190615665565b6001600160a01b03161015614b9657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614ae1565b5f6060826040015151603014614bc75760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614c08988a986001989297929690959094909390929101615e36565b60405160208183030381529060405290505f5b84608001516020015151811015614c7a57818560800151602001518281518110614c4757614c476156c5565b6020026020010151604051602001614c60929190615ef0565b60408051601f198184030181529190529150600101614c1b565b5060a0840151805160209182015151604051614c9a938593929101615f26565b60405160208183030381529060405290505f5b8460a001516020015151811015614d0c57818560a00151602001518281518110614cd957614cd96156c5565b6020026020010151604051602001614cf2929190615ef0565b60408051601f198184030181529190529150600101614cad565b5060c0840151604051614d23918391602001615f61565b6040516020818303038152906040529050600281604051614d449190615876565b602060405180830381855afa158015614d5f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d82919061564e565b94909350915050565b614d936144bc565b614d9b614fb6565b610dc281614fbe565b614dac6144bc565b6145056150a6565b614dbc6144bc565b5f80516020615fb383398151915261ffff85161580614de0575061271061ffff8616115b15614e0457604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614e285760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614e3b5750600a60ff8516115b15614e5e5760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614ec5576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614ee55760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3383835f6150ae565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613eef565b6145056144bc565b614fc66144bc565b80355f80516020615fd38339815191529081556014614feb6060840160408501615de0565b60ff16118061500a57506150056060830160408401615de0565b60ff16155b1561503e5761501f6060830160408401615de0565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b61504e6060830160408401615de0565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561507f604083016020840161540b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612bb56144bc565b6060814710156150d35760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b031684866040516150ee9190615876565b5f6040518083038185875af1925050503d805f8114615128576040519150601f19603f3d011682016040523d82523d5f602084013e61512d565b606091505b509150915061513d868383615147565b9695505050505050565b60608261515c57615157826151a3565b611e33565b815115801561517357506001600160a01b0384163b155b1561519c57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e33565b8051156151b35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151d8906155f6565b5f825580601f106151e7575050565b601f0160209004905f5260205f2090810190610dc29190615240565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615254575f8155600101615241565b5090565b8015158114610dc2575f80fd5b803563ffffffff81168114615278575f80fd5b919050565b5f805f6060848603121561528f575f80fd5b8335925060208401356152a181615258565b91506152af60408501615265565b90509250925092565b5f602082840312156152c8575f80fd5b5035919050565b5f80604083850312156152e0575f80fd5b82356001600160401b038111156152f5575f80fd5b830160808186031215615306575f80fd5b915061531460208401615265565b90509250929050565b5f806040838503121561532e575f80fd5b8235915061531460208401615265565b5f6020828403121561534e575f80fd5b611e3382615265565b803561ffff81168114615278575f80fd5b80356001600160401b0381168114615278575f80fd5b5f805f8060808587031215615391575f80fd5b84356001600160401b038111156153a6575f80fd5b850160a081880312156153b7575f80fd5b93506153c560208601615357565b92506153d360408601615368565b9396929550929360600135925050565b5f80604083850312156153f4575f80fd5b6153fd83615265565b946020939093013593505050565b5f6020828403121561541b575f80fd5b611e3382615368565b5f8060408385031215615435575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061546857615468615444565b9052565b5f5b8381101561548657818101518382015260200161546e565b50505f910152565b5f81518084526154a581602086016020860161546c565b601f01601f19169290920160200192915050565b602081526154cb602082018351615458565b5f602083015160e060408401526154e661010084018261548e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f80828403610160811215615560575f80fd5b6101408082121561556f575f80fd5b849350830135905061558081615539565b809150509250929050565b5f806020838503121561559c575f80fd5b82356001600160401b03808211156155b2575f80fd5b818501915085601f8301126155c5575f80fd5b8135818111156155d3575f80fd5b8660208285010111156155e4575f80fd5b60209290920196919550909350505050565b600181811c9082168061560a57607f821691505b60208210810361562857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf38284615458565b602081525f611e33602083018461548e565b5f6020828403121561565e575f80fd5b5051919050565b5f60208284031215615675575f80fd5b8135611e3381615539565b5f808335601e19843603018112615695575f80fd5b8301803591506001600160401b038211156156ae575f80fd5b6020019150600581901b3603821315613849575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156ed575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561572d5761572d6156f7565b60405290565b604080519081016001600160401b038111828210171561572d5761572d6156f7565b604051601f8201601f191681016001600160401b038111828210171561577d5761577d6156f7565b604052919050565b5f6001600160401b0382111561579d5761579d6156f7565b50601f01601f191660200190565b5f82601f8301126157ba575f80fd5b81356157cd6157c882615785565b615755565b8181528460208386010111156157e1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561580d575f80fd5b61581561570b565b82356001600160401b038082111561582b575f80fd5b615837368387016157ab565b8352602085013591508082111561584c575f80fd5b50615859368286016157ab565b60208301525061586b60408401615368565b604082015292915050565b5f82516156ed81846020870161546c565b601f8211156104e357805f5260205f20601f840160051c810160208510156158ac5750805b601f840160051c820191505b81811015611715575f81556001016158b8565b81516001600160401b038111156158e4576158e46156f7565b6158f8816158f284546155f6565b84615887565b602080601f83116001811461592b575f84156159145750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b828110156159595788860151825594840194600190910190840161593a565b508582101561597657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615986565b5f63ffffffff8083168181036159c5576159c5615986565b6001019392505050565b8082028115828204841417610cf357610cf3615986565b5f82615a0057634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a1957615a19615444565b91905290565b5f60208083525f8454615a31816155f6565b806020870152604060018084165f8114615a525760018114615a6e57615a9b565b60ff19851660408a0152604084151560051b8a01019550615a9b565b895f5260205f205f5b85811015615a925781548b8201860152908301908801615a77565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f9857611f98615986565b6001600160401b03828116828216039080821115611f9857611f98615986565b805161527881615258565b5f8060408385031215615b14575f80fd5b82516001600160401b0380821115615b2a575f80fd5b9084019060608287031215615b3d575f80fd5b615b4561570b565b82518152602080840151615b5881615539565b82820152604084015183811115615b6d575f80fd5b80850194505087601f850112615b81575f80fd5b83519250615b916157c884615785565b8381528882858701011115615ba4575f80fd5b615bb38483830184880161546c565b80604084015250819550615bc8818801615af8565b9450505050509250929050565b81810381811115610cf357610cf3615986565b5f808335601e19843603018112615bfd575f80fd5b8301803591506001600160401b03821115615c16575f80fd5b602001915036819003821315613849575f80fd5b5f8851615c3b818460208d0161546c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615cb657615cb6615986565b505092915050565b5f8235603e198336030181126156ed575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d10575f80fd5b615d18615733565b615d2183615265565b81526020808401356001600160401b0380821115615d3d575f80fd5b9085019036601f830112615d4f575f80fd5b813581811115615d6157615d616156f7565b8060051b9150615d72848301615755565b8181529183018401918481019036841115615d8b575f80fd5b938501935b83851015615db55784359250615da583615539565b8282529385019390850190615d90565b94860194909452509295945050505050565b5f60208284031215615dd7575f80fd5b611e3382615357565b5f60208284031215615df0575f80fd5b813560ff81168114611e33575f80fd5b5f6001600160401b038083168181036159c5576159c5615986565b5f60208284031215615e2b575f80fd5b8151611e3381615258565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e7c81602a850160208b0161546c565b865190830190615e9381602a840160208b0161546c565b60c087901b6001600160c01b031916602a9290910191820152615ec5603282018660e01b6001600160e01b0319169052565b615ede603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f0181846020880161546c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f3781846020890161546c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f7281846020880161546c565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615f31380380615f3183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615de48061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101c1575f3560e01c80638280a25a116100f6578063ba3a4b971161009a578063ba3a4b97146103d9578063bc5fbfec146103ec578063bee0a03f14610413578063c974d1b614610426578063d5f20ff61461042e578063df93d8de1461044e578063e4a63c4014610458578063f74c607b1461047f578063fd7ac5e714610492575f80fd5b80638280a25a1461034357806393e245981461034b57806398f3e2b41461035e5780639e1bc4ef14610371578063a3a65e4814610384578063a9778a7a14610270578063afb9809614610397578063b771b3bc146103be575f80fd5b80633a1cfff6116101685780633a1cfff61461028c578063467ef06f1461029f5780634bee0040146102b25780635297fae6146102d357806360305d62146102e6578063620658561461030357806366435abf14610316578063732214f81461032957806376f7862114610330575f80fd5b80630118acc4146101c55780630322ed98146101da578063151d30d1146101ed5780631ec447241461020c57806320d91b7a1461021f57806325e1c776146102325780632e2194d81461024557806335455ded14610270575b5f80fd5b6101d86101d3366004615085565b6104a5565b005b6101d86101e83660046150c0565b6104da565b6101f5600a81565b60405160ff90911681526020015b60405180910390f35b6101d861021a366004615085565b6106dd565b6101d861022d3660046150d7565b6106e8565b6101d8610240366004615125565b610be6565b6102586102533660046150c0565b610c5a565b6040516001600160401b039091168152602001610203565b61027961271081565b60405161ffff9091168152602001610203565b6101d861029a366004615085565b610cae565b6101d86102ad366004615146565b610cb9565b6102c56102c0366004615186565b610d69565b604051908152602001610203565b6101d86102e13660046151eb565b610d90565b6102ee601481565b60405163ffffffff9091168152602001610203565b6102c5610311366004615213565b610feb565b6102586103243660046150c0565b61100b565b6102c55f81565b6101d861033e366004615085565b61101f565b6101f5603081565b6101d86103593660046150c0565b61104a565b6101d861036c3660046151eb565b611107565b6102c561037f36600461522c565b6112c6565b6101d8610392366004615146565b6112e4565b6102c57f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b6103cc6005600160991b0181565b604051610203919061524c565b6101d86103e73660046150c0565b61146a565b6102c57fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b6101d86104213660046150c0565b611648565b6101f5601481565b61044161043c3660046150c0565b611765565b60405161020391906152d5565b6102586202a30081565b6102c57f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0081565b6101d861048d366004615369565b6118a7565b6102c56104a03660046153a7565b611986565b6104b08383836119be565b6104d557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f6104e3611d0b565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff16600581111561051c5761051c615260565b600581111561052d5761052d615260565b815260200160018201805461054190615412565b80601f016020809104026020016040519081016040528092919081815260200182805461056d90615412565b80156105b85780601f1061058f576101008083540402835291602001916105b8565b820191905f5260205f20905b81548152906001019060200180831161059b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561062357610623615260565b14610656575f8381526007830160205260409081902054905163170cc93360e21b81526104cc9160ff169060040161544a565b6005600160991b016001600160a01b031663ee5b48eb61067b8584606001515f611d2f565b6040518263ffffffff1660e01b81526004016106979190615458565b6020604051808303815f875af11580156106b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d7919061546a565b50505050565b6106d78383836119be565b5f6106f1611d0b565b600981015490915060ff161561071a57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561075d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610781919061546a565b8360200135146107aa576040516372b0a7e760e11b8152602084013560048201526024016104cc565b306107bb6060850160408601615481565b6001600160a01b0316146107f3576107d96060840160408501615481565b604051632f88120d60e21b81526004016104cc919061524c565b5f610801606085018561549c565b905090505f805b828163ffffffff161015610ae8575f610824606088018861549c565b8363ffffffff1681811061083a5761083a6154e1565b905060200281019061084c91906154f5565b61085590615619565b80516040519192505f91600888019161086d91615692565b9081526020016040518091039020541461089d57805160405163a41f772f60e01b81526104cc9190600401615458565b5f6002885f0135846040516020016108cc92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526108e691615692565b602060405180830381855afa158015610901573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610924919061546a565b90508086600801835f015160405161093c9190615692565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109be576109be615260565b0217905550602082015160018201906109d790826156e7565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090930151600390920180546001600160401b03191692841692909217909155830151610a7b9116856157b6565b8251604051919550610a8c91615692565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610ae1906157c9565b9050610808565b50600483018190556001830154606490610b0c90600160401b900460ff16836157eb565b1015610b2e57604051635943317f60e01b8152600481018290526024016104cc565b5f610b44610b3b86611d7e565b60400151611e89565b90505f610b5087612016565b90505f600282604051610b639190615692565b602060405180830381855afa158015610b7e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ba1919061546a565b9050828114610bcd57604051631872fc8d60e01b815260048101829052602481018490526044016104cc565b5050506009909201805460ff1916600117905550505050565b610bef826121eb565b610c0f576040516330efa98b60e01b8152600481018390526024016104cc565b5f610c1983611765565b5190506002816005811115610c3057610c30615260565b14610c50578060405163170cc93360e21b81526004016104cc919061544a565b6106d78383612214565b5f80610c64612462565b60030154610c729084615802565b9050801580610c8757506001600160401b0381115b15610ca85760405163222d164360e21b8152600481018490526024016104cc565b92915050565b6106d7838383612486565b610cc1612651565b5f610cca612462565b90505f80610cd78461269b565b91509150610ce4826121eb565b610cf057505050610d5e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1e57610d1e615260565b03610d43575f83815260088501602052604081208054919055610d4182826129d5565b505b610d5981610d548460400151610feb565b612a45565b505050505b610d66612a63565b50565b5f610d72612651565b610d7e85858585612a89565b9050610d88612a63565b949350505050565b5f610d99612462565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115610dd257610dd2615260565b6003811115610de357610de3615260565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e5982611765565b9050600183516003811115610e7057610e70615260565b14610e91578251604051633b0d540d60e21b81526104cc9190600401615821565b600481516005811115610ea657610ea6615260565b03610ebc57610eb485612c40565b505050505050565b5f80610ed3610eca89611d7e565b60400151612e60565b5091509150818414610f0057846040015160405163089938b360e11b81526004016104cc91815260200190565b806001600160401b031683606001516001600160401b03161080610f395750806001600160401b03168560a001516001600160401b0316115b15610f6257604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cc565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b19909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ff4612462565b60030154610ca8906001600160401b0384166157eb565b5f61101582611765565b6080015192915050565b61102a838383612486565b6104d557604051635bff683f60e11b8152600481018490526024016104cc565b5f611053612462565b90505f61105f83611765565b519050600481600581111561107657611076615260565b14611096578060405163170cc93360e21b81526004016104cc919061544a565b5f8381526005830160205260409020546001600160a01b031633146110d157335b604051636e2ccd7560e11b81526004016104cc919061524c565b5f838152600883016020908152604080832080549084905560058601909252909120546106d7906001600160a01b0316826129d5565b61110f612651565b5f611118612462565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff16600381111561115157611151615260565b600381111561116257611162615260565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db615260565b146111fc578051604051633b0d540d60e21b81526104cc9190600401615821565b600461120b8260400151611765565b51600581111561121d5761121d615260565b146112af575f61122c85611d7e565b90505f8061123d8360400151612e60565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cc565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cc565b5050505b6112b883612c40565b50506112c2612a63565b5050565b5f6112cf612651565b6112da8333846130b6565b9050610ca8612a63565b5f6112ed611d0b565b90505f806113066112fd85611d7e565b6040015161338b565b915091508061132c57604051632d07135360e01b815281151560048201526024016104cc565b5f8281526006840160205260409020805461134690615412565b90505f0361136a5760405163089938b360e11b8152600481018390526024016104cc565b60015f83815260078501602052604090205460ff16600581111561139057611390615260565b146113c3575f8281526007840160205260409081902054905163170cc93360e21b81526104cc9160ff169060040161544a565b5f82815260068401602052604081206113db91614fd4565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611473612462565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156114ac576114ac615260565b60038111156114bd576114bd615260565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561153657611536615260565b14158015611557575060038151600381111561155457611554615260565b14155b15611578578051604051633b0d540d60e21b81526104cc9190600401615821565b5f6115868260400151611765565b905080606001516001600160401b03165f036115b8576040516339b894f960e21b8152600481018590526024016104cc565b6005600160991b016001600160a01b031663ee5b48eb6115e5846040015184606001518560800151611d2f565b6040518263ffffffff1660e01b81526004016116019190615458565b6020604051808303815f875af115801561161d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611641919061546a565b5050505050565b5f611651611d0b565b5f838152600682016020526040902080549192509061166f90615412565b90505f036116935760405163089938b360e11b8152600481018390526024016104cc565b60015f83815260078301602052604090205460ff1660058111156116b9576116b9615260565b146116ec575f8281526007820160205260409081902054905163170cc93360e21b81526104cc9160ff169060040161544a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611725919060040161583b565b6020604051808303815f875af1158015611741573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d5919061546a565b61176d61500b565b5f611776611d0b565b5f84815260078201602052604090819020815160e0810190925280549293509091829060ff1660058111156117ad576117ad615260565b60058111156117be576117be615260565b81526020016001820180546117d290615412565b80601f01602080910402602001604051908101604052809291908181526020018280546117fe90615412565b80156118495780601f1061182057610100808354040283529160200191611849565b820191905f5260205f20905b81548152906001019060200180831161182c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806118f0575080546001600160401b03808416911610155b1561190e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119398484613547565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80611990611d0b565b90508060080184846040516119a69291906158c5565b90815260200160405180910390205491505092915050565b5f806119c8612462565b5f868152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115611a0157611a01615260565b6003811115611a1257611a12615260565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611a8882611765565b9050600283516003811115611a9f57611a9f615260565b14611ac0578251604051633b0d540d60e21b81526104cc9190600401615821565b60208301516001600160a01b03163314611b5c575f8281526005850160205260409020546001600160a01b03163314611af957336110b7565b5f82815260058501602052604090205460a0820151611b2891600160b01b90046001600160401b0316906158d4565b6001600160401b0316421015611b5c5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cc565b600281516005811115611b7157611b71615260565b03611c9f5760028401546080840151611b93916001600160401b0316906158d4565b6001600160401b0316421015611bc75760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cc565b8615611bd957611bd78287612214565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611c12918491611c0d91906158f4565b613561565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c53846136ab565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d049350505050565b600481516005811115611cb457611cb4615260565b03611ce857611cc2836136ab565b5f898152600786016020526040902055611cdb88612c40565b6001945050505050611d04565b805160405163170cc93360e21b81526104cc919060040161544a565b9392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611de2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e09919081019061591f565b9150915080611e2b57604051636b2f19e960e01b815260040160405180910390fd5b815115611e51578151604051636ba589a560e01b815260048101919091526024016104cc565b60208201516001600160a01b031615611e82578160200151604051624de75d60e31b81526004016104cc919061524c565b5092915050565b5f8151602614611ebe57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cc565b5f805b6002811015611f0d57611ed58160016159f1565b611ee09060086157eb565b61ffff16848281518110611ef657611ef66154e1565b016020015160f81c901b9190911790600101611ec1565b5061ffff811615611f375760405163407b587360e01b815261ffff821660048201526024016104cc565b5f805b6004811015611f9257611f4e8160036159f1565b611f599060086157eb565b63ffffffff1685611f6b8360026157b6565b81518110611f7b57611f7b6154e1565b016020015160f81c901b9190911790600101611f3a565b5063ffffffff811615611fb857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561200d57611fcf81601f6159f1565b611fda9060086157eb565b86611fe68360066157b6565b81518110611ff657611ff66154e1565b016020015160f81c901b9190911790600101611fbb565b50949350505050565b60605f8083356020850135601461203287870160408901615481565b61203f606089018961549c565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6001600160601b03191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6120c0606085018561549c565b9050811015611e8257816120d7606086018661549c565b838181106120e7576120e76154e1565b90506020028101906120f991906154f5565b6121039080615a04565b9050612112606087018761549c565b84818110612122576121226154e1565b905060200281019061213491906154f5565b61213e9080615a04565b61214b606089018961549c565b8681811061215b5761215b6154e1565b905060200281019061216d91906154f5565b61217b906020810190615a04565b61218860608b018b61549c565b88818110612198576121986154e1565b90506020028101906121aa91906154f5565b6121bb906060810190604001615213565b6040516020016121d19796959493929190615a46565b60408051601f1981840301815291905291506001016120b3565b5f806121f5612462565b5f938452600501602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561225f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612286919081019061591f565b91509150806122a857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230f919061546a565b825114612335578151604051636ba589a560e01b815260048101919091526024016104cc565b60208201516001600160a01b031615612366578160200151604051624de75d60e31b81526004016104cc919061524c565b5f80612375846040015161382e565b9150915081871461239c5760405163089938b360e11b8152600481018890526024016104cc565b5f6123a5612462565b5f8981526005820160205260409020600101549091506001600160401b039081169083161115612438575f88815260058201602090815260409182902060010180546001600160401b0319166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612457565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f80612490612462565b90505f61249c86613a1f565b90506124a7866121eb565b6124b657600192505050611d04565b5f8681526005830160205260409020546001600160a01b031633146124db57336110b7565b5f86815260058301602052604090205460a082015161250a91600160b01b90046001600160401b0316906158d4565b6001600160401b03168160c001516001600160401b031610156125515760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cc565b5f8515612569576125628786612214565b9050612587565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906125ac90610feb565b60a086015160c08701516040516001600160e01b031960e086901b1681526125dc93929182918990600401615aaf565b602060405180830381865afa1580156125f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261b919061546a565b905080846008015f8a81526020019081526020015f205f82825461263f91906157b6565b90915550501515979650505050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161269557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6126a461500b565b5f6126ad611d0b565b90505f806126bd6112fd87611d7e565b9150915080156126e457604051632d07135360e01b815281151560048201526024016104cc565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561271557612715615260565b600581111561272657612726615260565b815260200160018201805461273a90615412565b80601f016020809104026020016040519081016040528092919081815260200182805461276690615412565b80156127b15780601f10612788576101008083540402835291602001916127b1565b820191905f5260205f20905b81548152906001019060200180831161279457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561281c5761281c615260565b1415801561283d575060018151600581111561283a5761283a615260565b14155b1561285e57805160405163170cc93360e21b81526104cc919060040161544a565b60038151600581111561287357612873615260565b036128815760048152612886565b600581525b83600801816020015160405161289c9190615692565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156128e0576128e0615260565b0217905550602082015160018201906128f990826156e7565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790558051600581111561299e5761299e615260565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f6129de613cf7565b80546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a2a575f80fd5b505af1158015612a3c573d5f803e3d5ffd5b50505050505050565b6112c28282612a52613cf7565b546001600160a01b03169190613d1b565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f80612a93612462565b600281015490915061ffff600160401b90910481169086161080612abc575061271061ffff8616115b15612ae057604051635f12e6c360e11b815261ffff861660048201526024016104cc565b60028101546001600160401b039081169085161015612b1c576040516202a06d60e11b81526001600160401b03851660048201526024016104cc565b8054831080612b2e5750806001015483115b15612b4f5760405163222d164360e21b8152600481018490526024016104cc565b5f612b5984613d7a565b90505f612b6582610c5a565b90505f612b728983613d97565b90506040518060800160405280612b863390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b0319909416951694909417919091179890981617815591015160019091018054919095166001600160401b0319909116179093555090915050949350505050565b5f612c49612462565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115612c8257612c82615260565b6003811115612c9357612c93615260565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612d076142f4565b8260800151612d1691906158d4565b6001600160401b0316421015612d4a5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cc565b5f848152600684016020908152604080832080546001600160a81b03191681556001810184905560020183905560078601909152812080549082905590808215612e05575f84815260058701602052604090205461271090612db790600160a01b900461ffff16856157eb565b612dc19190615802565b915081866008015f8681526020019081526020015f205f828254612de591906157b6565b90915550612df5905082846159f1565b9050612e058560200151826129d5565b612e1a8560200151610d548760600151610feb565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e9757835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cc565b5f805b6002811015612ee657612eae8160016159f1565b612eb99060086157eb565b61ffff16868281518110612ecf57612ecf6154e1565b016020015160f81c901b9190911790600101612e9a565b5061ffff811615612f105760405163407b587360e01b815261ffff821660048201526024016104cc565b5f805b6004811015612f6b57612f278160036159f1565b612f329060086157eb565b63ffffffff1687612f448360026157b6565b81518110612f5457612f546154e1565b016020015160f81c901b9190911790600101612f13565b5063ffffffff8116600314612f9357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fe857612faa81601f6159f1565b612fb59060086157eb565b88612fc18360066157b6565b81518110612fd157612fd16154e1565b016020015160f81c901b9190911790600101612f96565b505f805b6008811015613047576130008160076159f1565b61300b9060086157eb565b6001600160401b0316896130208360266157b6565b81518110613030576130306154e1565b016020015160f81c901b9190911790600101612fec565b505f805b60088110156130a65761305f8160076159f1565b61306a9060086157eb565b6001600160401b03168a61307f83602e6157b6565b8151811061308f5761308f6154e1565b016020015160f81c901b919091179060010161304b565b5091989097509095509350505050565b5f806130c0612462565b90505f6130cf61025385613d7a565b90505f6130db87611765565b90506130e6876121eb565b613106576040516330efa98b60e01b8152600481018890526024016104cc565b60028151600581111561311b5761311b615260565b1461313c57805160405163170cc93360e21b81526104cc919060040161544a565b5f82826080015161314d91906158d4565b905083600201600a9054906101000a90046001600160401b031682604001516131769190615add565b6001600160401b0316816001600160401b031611156131b357604051636d51fe0560e11b81526001600160401b03821660048201526024016104cc565b5f806131bf8a84613561565b915091505f8a836040516020016131ed92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561328057613280615260565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146133c157825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cc565b5f805b6002811015613410576133d88160016159f1565b6133e39060086157eb565b61ffff168582815181106133f9576133f96154e1565b016020015160f81c901b91909117906001016133c4565b5061ffff81161561343a5760405163407b587360e01b815261ffff821660048201526024016104cc565b5f805b6004811015613495576134518160036159f1565b61345c9060086157eb565b63ffffffff168661346e8360026157b6565b8151811061347e5761347e6154e1565b016020015160f81c901b919091179060010161343d565b5063ffffffff81166002146134bd57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613512576134d481601f6159f1565b6134df9060086157eb565b876134eb8360066157b6565b815181106134fb576134fb6154e1565b016020015160f81c901b91909117906001016134c0565b505f86602681518110613527576135276154e1565b016020015191976001600160f81b03199092161515965090945050505050565b61354f61430f565b6135588261435a565b6112c2816143ce565b5f805f61356c611d0b565b5f868152600782016020526040902060020154909150600160801b90046001600160401b031661359c858261442a565b5f6135a68761464f565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6135f68a858b611d2f565b6040518263ffffffff1660e01b81526004016136129190615458565b6020604051808303815f875af115801561362e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613652919061546a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f806136b5612462565b90505f6136c58460400151611765565b90505f6003825160058111156136dd576136dd615260565b14806136fb57506004825160058111156136f9576136f9615260565b145b1561370b575060c0810151613748565b60028251600581111561372057613720615260565b0361372c575042613748565b815160405163170cc93360e21b81526104cc919060040161544a565b84608001516001600160401b0316816001600160401b03161161376f57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061379490610feb565b60a085015160808901516040808b01515f90815260058a016020528190206001015490516001600160e01b031960e087901b1681526137e69493929188916001600160401b0390911690600401615aaf565b602060405180830381865afa158015613801573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613825919061546a565b95945050505050565b5f808251602e1461386457825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cc565b5f805b60028110156138b35761387b8160016159f1565b6138869060086157eb565b61ffff1685828151811061389c5761389c6154e1565b016020015160f81c901b9190911790600101613867565b5061ffff8116156138dd5760405163407b587360e01b815261ffff821660048201526024016104cc565b5f805b6004811015613938576138f48160036159f1565b6138ff9060086157eb565b63ffffffff16866139118360026157b6565b81518110613921576139216154e1565b016020015160f81c901b91909117906001016138e0565b5063ffffffff81161561395e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139b35761397581601f6159f1565b6139809060086157eb565b8761398c8360066157b6565b8151811061399c5761399c6154e1565b016020015160f81c901b9190911790600101613961565b505f805b6008811015613a12576139cb8160076159f1565b6139d69060086157eb565b6001600160401b0316886139eb8360266157b6565b815181106139fb576139fb6154e1565b016020015160f81c901b91909117906001016139b7565b5090969095509350505050565b613a2761500b565b5f613a30611d0b565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff166005811115613a6957613a69615260565b6005811115613a7a57613a7a615260565b8152602001600182018054613a8e90615412565b80601f0160208091040260200160405190810160405280929190818152602001828054613aba90615412565b8015613b055780601f10613adc57610100808354040283529160200191613b05565b820191905f5260205f20905b815481529060010190602001808311613ae857829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613b7357613b73615260565b14613ba6575f8481526007830160205260409081902054905163170cc93360e21b81526104cc9160ff169060040161544a565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613bea57613bea615260565b021790555060208201516001820190613c0390826156e7565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790555f613ca08582613561565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0090565b6040516001600160a01b038381166024830152604482018390526104d591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146b8565b5f610ca882613d87613cf7565b546001600160a01b031690614710565b5f613da0611d0b565b6009015460ff16613dc457604051637fab81e560e01b815260040160405180910390fd5b5f613dcd611d0b565b905042613de06060860160408701615213565b6001600160401b0316111580613e1a5750613dfe6202a300426157b6565b613e0e6060860160408701615213565b6001600160401b031610155b15613e5457613e2f6060850160408601615213565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cc565b613e69613e646060860186615b08565b614871565b613e79613e646080860186615b08565b6030613e886020860186615a04565b905014613eba57613e9c6020850185615a04565b6040516326475b2f60e11b81526104cc925060040190815260200190565b613ec48480615a04565b90505f03613ef157613ed68480615a04565b604051633e08a12560e11b81526004016104cc929190615b1c565b5f60088201613f008680615a04565b604051613f0e9291906158c5565b90815260200160405180910390205414613f4757613f2c8480615a04565b60405163a41f772f60e01b81526004016104cc929190615b1c565b613f51835f61442a565b6040805160e08101909152815481525f90819061405d9060208101613f768980615a04565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613fbe908a018a615a04565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161400760608a0160408b01615213565b6001600160401b0316815260200161402260608a018a615b08565b61402b90615b4a565b815260200161403d60808a018a615b08565b61404690615b4a565b8152602001876001600160401b03168152506149da565b5f8281526006860160205260409020919350915061407b82826156e7565b50816008840161408b8880615a04565b6040516140999291906158c5565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906140d5908590600401615458565b6020604051808303815f875af11580156140f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614115919061546a565b6040805160e0810190915290915080600181526020016141358980615a04565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156141c4576141c4615260565b0217905550602082015160018201906141dd90826156e7565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790558061427a8880615a04565b6040516142889291906158c5565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906142c69190615213565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6142fd611d0b565b600101546001600160401b0316919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661435857604051631afcd79f60e31b815260040160405180910390fd5b565b61436261430f565b61436b81614bc7565b614373614be0565b610d666060820135608083013561439060c0850160a08601615213565b6143a060e0860160c08701615c11565b6143b1610100870160e08801615c2a565b6101008701356143c961014089016101208a01615481565b614bf0565b6143d661430f565b5f6143df613cf7565b90506001600160a01b03821661440a5781604051637330680360e01b81526004016104cc919061524c565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f614433611d0b565b90505f826001600160401b0316846001600160401b031611156144615761445a83856158f4565b905061446e565b61446b84846158f4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806144d05750600184015481516144cc916001600160401b0316906157b6565b8210155b156144f6576001600160401b038316606082015281815260408101516020820152614515565b828160600181815161450891906158d4565b6001600160401b03169052505b6060810151614525906064615add565b602082015160018601546001600160401b0392909216916145509190600160401b900460ff166157eb565b101561458057606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cc565b856001600160401b03168160400181815161459b91906157b6565b9052506040810180516001600160401b03871691906145bb9083906159f1565b905250600184015460408201516064916145e091600160401b90910460ff16906157eb565b1015614607578060400151604051635943317f60e01b81526004016104cc91815260200190565b80516002850155602081015160038501556040810151600485015560600151600590930180546001600160401b0319166001600160401b039094169390931790925550505050565b5f80614659611d0b565b5f848152600782016020526040902060020180549192509060089061468d90600160401b90046001600160401b0316615c4a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146cc6001600160a01b03841683614d86565b905080515f141580156146f05750808060200190518101906146ee9190615c65565b155b156104d55782604051635274afe760e01b81526004016104cc919061524c565b5f80836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161473e919061524c565b602060405180830381865afa158015614759573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061477d919061546a565b90506147946001600160a01b038516333086614d93565b6040516370a0823160e01b81525f906001600160a01b038616906370a08231906147c290309060040161524c565b602060405180830381865afa1580156147dd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614801919061546a565b90508181116148675760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cc565b61382582826159f1565b61487e6020820182615146565b63ffffffff1615801561489e5750614899602082018261549c565b151590505b156148e5576148b06020820182615146565b6148bd602083018361549c565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cc565b6148f2602082018261549c565b90506149016020830183615146565b63ffffffff16111561491a576148b06020820182615146565b60015b61492a602083018361549c565b90508110156112c257614940602083018361549c565b61494b6001846159f1565b81811061495a5761495a6154e1565b905060200201602081019061496f9190615481565b6001600160a01b0316614985602084018461549c565b83818110614995576149956154e1565b90506020020160208101906149aa9190615481565b6001600160a01b031610156149d257604051630dbc8d5f60e31b815260040160405180910390fd5b60010161491d565b5f6060826040015151603014614a035760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a44988a986001989297929690959094909390929101615c80565b60405160208183030381529060405290505f5b84608001516020015151811015614ab657818560800151602001518281518110614a8357614a836154e1565b6020026020010151604051602001614a9c929190615d3a565b60408051601f198184030181529190529150600101614a57565b5060a0840151805160209182015151604051614ad6938593929101615d6b565b60405160208183030381529060405290505f5b8460a001516020015151811015614b4857818560a00151602001518281518110614b1557614b156154e1565b6020026020010151604051602001614b2e929190615d3a565b60408051601f198184030181529190529150600101614ae9565b5060c0840151604051614b5f918391602001615da6565b6040516020818303038152906040529050600281604051614b809190615692565b602060405180830381855afa158015614b9b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bbe919061546a565b94909350915050565b614bcf61430f565b614bd7614dcc565b610d6681614dd4565b614be861430f565b614358614eb7565b614bf861430f565b5f614c01612462565b905061ffff85161580614c19575061271061ffff8616115b15614c3d57604051635f12e6c360e11b815261ffff861660048201526024016104cc565b86881115614c615760405163222d164360e21b8152600481018990526024016104cc565b60ff84161580614c745750600a60ff8516115b15614c975760405163170db35960e31b815260ff851660048201526024016104cc565b614c9f6142f4565b6001600160401b0316866001600160401b03161015614cdb576040516202a06d60e11b81526001600160401b03871660048201526024016104cc565b825f03614cfb5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d0483835f614ebf565b6040516001600160a01b0384811660248301528381166044830152606482018390526106d79186918216906323b872dd90608401613d48565b61435861430f565b614ddc61430f565b5f614de5611d0b565b8235815590506014614dfd6060840160408501615c2a565b60ff161180614e1c5750614e176060830160408401615c2a565b60ff16155b15614e5057614e316060830160408401615c2a565b604051634a59bbff60e11b815260ff90911660048201526024016104cc565b614e606060830160408401615c2a565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e916040830160208401615213565b60019190910180546001600160401b0319166001600160401b0390921691909117905550565b612a6361430f565b606081471015614ee4573060405163cd78605960e01b81526004016104cc919061524c565b5f80856001600160a01b03168486604051614eff9190615692565b5f6040518083038185875af1925050503d805f8114614f39576040519150601f19603f3d011682016040523d82523d5f602084013e614f3e565b606091505b5091509150614f4e868383614f58565b9695505050505050565b606082614f6d57614f6882614fab565b611d04565b8151158015614f8457506001600160a01b0384163b155b15614fa45783604051639996b31560e01b81526004016104cc919061524c565b5080611d04565b805115614fbb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614fe090615412565b5f825580601f10614fef575050565b601f0160209004905f5260205f2090810190610d669190615048565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b8082111561505c575f8155600101615049565b5090565b8015158114610d66575f80fd5b803563ffffffff81168114615080575f80fd5b919050565b5f805f60608486031215615097575f80fd5b8335925060208401356150a981615060565b91506150b76040850161506d565b90509250925092565b5f602082840312156150d0575f80fd5b5035919050565b5f80604083850312156150e8575f80fd5b82356001600160401b038111156150fd575f80fd5b83016080818603121561510e575f80fd5b915061511c6020840161506d565b90509250929050565b5f8060408385031215615136575f80fd5b8235915061511c6020840161506d565b5f60208284031215615156575f80fd5b611d048261506d565b803561ffff81168114615080575f80fd5b80356001600160401b0381168114615080575f80fd5b5f805f8060808587031215615199575f80fd5b84356001600160401b038111156151ae575f80fd5b850160a081880312156151bf575f80fd5b93506151cd6020860161515f565b92506151db60408601615170565b9396929550929360600135925050565b5f80604083850312156151fc575f80fd5b6152058361506d565b946020939093013593505050565b5f60208284031215615223575f80fd5b611d0482615170565b5f806040838503121561523d575f80fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b634e487b7160e01b5f52602160045260245ffd5b6006811061528457615284615260565b9052565b5f5b838110156152a257818101518382015260200161528a565b50505f910152565b5f81518084526152c1816020860160208601615288565b601f01601f19169290920160200192915050565b602081526152e7602082018351615274565b5f602083015160e060408401526153026101008401826152aa565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d66575f80fd5b5f8082840361016081121561537c575f80fd5b6101408082121561538b575f80fd5b849350830135905061539c81615355565b809150509250929050565b5f80602083850312156153b8575f80fd5b82356001600160401b03808211156153ce575f80fd5b818501915085601f8301126153e1575f80fd5b8135818111156153ef575f80fd5b866020828501011115615400575f80fd5b60209290920196919550909350505050565b600181811c9082168061542657607f821691505b60208210810361544457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ca88284615274565b602081525f611d0460208301846152aa565b5f6020828403121561547a575f80fd5b5051919050565b5f60208284031215615491575f80fd5b8135611d0481615355565b5f808335601e198436030181126154b1575f80fd5b8301803591506001600160401b038211156154ca575f80fd5b6020019150600581901b36038213156136a4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615509575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561554957615549615513565b60405290565b604080519081016001600160401b038111828210171561554957615549615513565b604051601f8201601f191681016001600160401b038111828210171561559957615599615513565b604052919050565b5f6001600160401b038211156155b9576155b9615513565b50601f01601f191660200190565b5f82601f8301126155d6575f80fd5b81356155e96155e4826155a1565b615571565b8181528460208386010111156155fd575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615629575f80fd5b615631615527565b82356001600160401b0380821115615647575f80fd5b615653368387016155c7565b83526020850135915080821115615668575f80fd5b50615675368286016155c7565b60208301525061568760408401615170565b604082015292915050565b5f8251615509818460208701615288565b601f8211156104d557805f5260205f20601f840160051c810160208510156156c85750805b601f840160051c820191505b81811015611641575f81556001016156d4565b81516001600160401b0381111561570057615700615513565b6157148161570e8454615412565b846156a3565b602080601f831160018114615747575f84156157305750858301515b5f19600386901b1c1916600185901b178555610eb4565b5f85815260208120601f198616915b8281101561577557888601518255948401946001909101908401615756565b508582101561579257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ca857610ca86157a2565b5f63ffffffff8083168181036157e1576157e16157a2565b6001019392505050565b8082028115828204841417610ca857610ca86157a2565b5f8261581c57634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061583557615835615260565b91905290565b5f60208083525f845461584d81615412565b806020870152604060018084165f811461586e576001811461588a576158b7565b60ff19851660408a0152604084151560051b8a010195506158b7565b895f5260205f205f5b858110156158ae5781548b8201860152908301908801615893565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611e8257611e826157a2565b6001600160401b03828116828216039080821115611e8257611e826157a2565b805161508081615060565b5f8060408385031215615930575f80fd5b82516001600160401b0380821115615946575f80fd5b9084019060608287031215615959575f80fd5b615961615527565b8251815260208084015161597481615355565b82820152604084015183811115615989575f80fd5b80850194505087601f85011261599d575f80fd5b835192506159ad6155e4846155a1565b83815288828587010111156159c0575f80fd5b6159cf84838301848801615288565b806040840152508195506159e4818801615914565b9450505050509250929050565b81810381811115610ca857610ca86157a2565b5f808335601e19843603018112615a19575f80fd5b8301803591506001600160401b03821115615a32575f80fd5b6020019150368190038213156136a4575f80fd5b5f8851615a57818460208d01615288565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b9485526001600160401b03938416602086015291831660408501528216606084015216608082015260a00190565b6001600160401b03818116838216028082169190828114615b0057615b006157a2565b505092915050565b5f8235603e19833603018112615509575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615b5a575f80fd5b615b6261554f565b615b6b8361506d565b81526020808401356001600160401b0380821115615b87575f80fd5b9085019036601f830112615b99575f80fd5b813581811115615bab57615bab615513565b8060051b9150615bbc848301615571565b8181529183018401918481019036841115615bd5575f80fd5b938501935b83851015615bff5784359250615bef83615355565b8282529385019390850190615bda565b94860194909452509295945050505050565b5f60208284031215615c21575f80fd5b611d048261515f565b5f60208284031215615c3a575f80fd5b813560ff81168114611d04575f80fd5b5f6001600160401b038083168181036157e1576157e16157a2565b5f60208284031215615c75575f80fd5b8151611d0481615060565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615cc681602a850160208b01615288565b865190830190615cdd81602a840160208b01615288565b60c087901b6001600160c01b031916602a9290910191820152615d0f603282018660e01b6001600160e01b0319169052565b615d28603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615d4b818460208801615288565b60609390931b6001600160601b0319169190920190815260140192915050565b5f8451615d7c818460208901615288565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615db7818460208801615288565b60c09390931b6001600160c01b031916919092019081526008019291505056fea164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go index 0fc8582cd..ab51fdaa6 100644 --- a/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -32,7 +32,7 @@ var ( // ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. var ExampleRewardCalculatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"uptimeSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", - Bin: "0x60a0604052348015600e575f80fd5b5060405161036a38038061036a833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102e66100845f395f818160c5015261016101526102e65ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80634f22429f146100595780635dcc93911461007f578063a9778a7a1461008a578063afba878a146100a6578063bb65b242146100c0575b5f80fd5b61006c6100673660046101db565b610100565b6040519081526020015b60405180910390f35b61006c6301e1338081565b61009361271081565b60405161ffff9091168152602001610076565b6100ae605081565b60405160ff9091168152602001610076565b6100e77f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610076565b5f605061010d8685610249565b6101179190610271565b67ffffffffffffffff1661012c836064610271565b67ffffffffffffffff16101561014357505f6101b6565b6127106301e133806101558686610249565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1689610195919061029d565b61019f919061029d565b6101a991906102ba565b6101b391906102ba565b90505b95945050505050565b803567ffffffffffffffff811681146101d6575f80fd5b919050565b5f805f805f60a086880312156101ef575f80fd5b853594506101ff602087016101bf565b935061020d604087016101bf565b925061021b606087016101bf565b9150610229608087016101bf565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561026a5761026a610235565b5092915050565b67ffffffffffffffff81811683821602808216919082811461029557610295610235565b505092915050565b80820281158282048414176102b4576102b4610235565b92915050565b5f826102d457634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + Bin: "0x60a0604052348015600e575f80fd5b50604051610362380380610362833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102de6100845f395f818160c5015261015d01526102de5ff3fe608060405234801561000f575f80fd5b5060043610610055575f3560e01c80634f22429f146100595780635dcc93911461007f578063a9778a7a1461008a578063afba878a146100a6578063bb65b242146100c0575b5f80fd5b61006c6100673660046101d5565b6100ff565b6040519081526020015b60405180910390f35b61006c6301e1338081565b61009361271081565b60405161ffff9091168152602001610076565b6100ae605081565b60405160ff9091168152602001610076565b6100e77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160401b039091168152602001610076565b5f605061010c8685610243565b610116919061026a565b6001600160401b031661012a83606461026a565b6001600160401b0316101561014057505f6101b1565b6127106301e133806101528686610243565b6001600160401b03167f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316896101909190610295565b61019a9190610295565b6101a491906102b2565b6101ae91906102b2565b90505b95945050505050565b80356001600160401b03811681146101d0575f80fd5b919050565b5f805f805f60a086880312156101e9575f80fd5b853594506101f9602087016101ba565b9350610207604087016101ba565b9250610215606087016101ba565b9150610223608087016101ba565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156102635761026361022f565b5092915050565b6001600160401b0381811683821602808216919082811461028d5761028d61022f565b505092915050565b80820281158282048414176102ac576102ac61022f565b92915050565b5f826102cc57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 65b8b0a39..eb53a49c9 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615eb7380380615eb783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d6a8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004615021565b610615565b005b348015610221575f80fd5b5061021461023036600461505c565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004615021565b610858565b34801561028a575f80fd5b50610214610299366004615073565b610863565b3480156102a9575f80fd5b506102146102b83660046150c1565b610d8d565b3480156102c8575f80fd5b506102dc6102d736600461505c565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004615021565b610e5b565b348015610378575f80fd5b506102146103873660046150e2565b610e66565b348015610397575f80fd5b506102146103a63660046150fb565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004615139565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b36600461505c565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004615021565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b5061021461048036600461505c565b611208565b348015610490575f80fd5b5061021461049f3660046150fb565b6112d3565b3480156104af575f80fd5b506102146104be3660046150e2565b6114ab565b6103f36104d1366004615163565b611634565b3480156104e1575f80fd5b506103f35f80516020615cbe83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a36600461505c565b611668565b34801561053a575f80fd5b506103f35f80516020615cde83398151915281565b34801561055a575f80fd5b5061021461056936600461505c565b611851565b348015610579575f80fd5b506102146105883660046151b7565b61198e565b6103f361059b36600461505c565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce36600461505c565b611a9c565b6040516102579190615243565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f36106103660046152c3565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d3e8339815191526020526040808220815160e0810190925280545f80516020615cde83398151915293929190829060ff166005811115610697576106976151ce565b60058111156106a8576106a86151ce565b81526020016001820180546106bc9061532e565b80601f01602080910402602001604051908101604052809291908181526020018280546106e89061532e565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6151ce565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615360565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f97565b6040518263ffffffff1660e01b8152600401610812919061536e565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615380565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615cde8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615380565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016153ab565b6001600160a01b0316146109995761097460608401604085016153ab565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856153c6565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886153c6565b8363ffffffff168181106109e0576109e061540b565b90506020028101906109f2919061541f565b6109fb90615543565b80516040519192505f916008880191610a13916155bc565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161536e565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c916155bc565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615380565b90508086600801835f0151604051610ae291906155bc565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646151ce565b021790555060208201516001820190610b7d9082615611565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c229116856156e0565b8251604051919550610c33916155bc565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c88906156f3565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615715565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fe6565b604001516120fc565b90505f610cf787612289565b90505f600282604051610d0a91906155bc565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615380565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612463565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd76151ce565b14610df7578060405163170cc93360e21b815260040161063c9190615360565b610852838361249e565b5f805f80516020615cbe83398151915260030154610e1f908461572c565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612718565b610e6e612904565b5f80516020615cbe8339815191525f80610e878461293b565b91509150610e9482612463565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece6151ce565b03610ef3575f83815260088501602052604081208054919055610ef18282612c79565b505b610f0981610f048460400151611192565b612cd7565b505050505b610f2460015f80516020615d1e83398151915255565b50565b5f8181525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe83398151915293929190829060ff166003811115610f7457610f746151ce565b6003811115610f8557610f856151ce565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b9050600183516003811115611012576110126151ce565b14611033578251604051633b0d540d60e21b815261063c919060040161574b565b600481516005811115611048576110486151ce565b0361105e5761105685612cfd565b505050505050565b5f8061107561106c89611fe6565b60400151612f51565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b038416615715565b5f6111d382611a9c565b6080015192915050565b6111e8838383612718565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615cbe8339815191525f61122083611a9c565b5190506004816005811115611237576112376151ce565b14611257578060405163170cc93360e21b815260040161063c9190615360565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c79565b6112db612904565b5f8181525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe83398151915293929190829060ff166003811115611328576113286151ce565b6003811115611339576113396151ce565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b26151ce565b146113d3578051604051633b0d540d60e21b815261063c919060040161574b565b60046113e28260400151611a9c565b5160058111156113f4576113f46151ce565b14611486575f61140385611fe6565b90505f806114148360400151612f51565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612cfd565b50506114a760015f80516020615d1e83398151915255565b5050565b5f80516020615cde8339815191525f806114d06114c785611fe6565b604001516131a7565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546115109061532e565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a6151ce565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615360565b5f82815260068401602052604081206115a591614f75565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d612904565b61164984848434613363565b905061166160015f80516020615d1e83398151915255565b9392505050565b5f8181525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe83398151915293929190829060ff1660038111156116b5576116b56151ce565b60038111156116c6576116c66151ce565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f6151ce565b14158015611760575060038151600381111561175d5761175d6151ce565b14155b15611781578051604051633b0d540d60e21b815261063c919060040161574b565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151611f97565b6040518263ffffffff1660e01b815260040161180a919061536e565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615380565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615cde83398151915291906118989061532e565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e26151ce565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615360565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e9190600401615765565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615380565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f83613531565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a74612904565b611a7f823334613542565b9050611a9760015f80516020615d1e83398151915255565b919050565b611aa4614fac565b5f8281525f80516020615d3e833981519152602052604090819020815160e0810190925280545f80516020615cde833981519152929190829060ff166005811115611af157611af16151ce565b6005811115611b0257611b026151ce565b8152602001600182018054611b169061532e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b429061532e565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615cde833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e90869086906157ef565b90815260200160405180910390205491505092915050565b5f8381525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe8339815191529284929091829060ff166003811115611c9457611c946151ce565b6003811115611ca557611ca56151ce565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d326151ce565b14611d53578251604051633b0d540d60e21b815261063c919060040161574b565b60208301516001600160a01b03163314611def575f8281526005850160205260409020546001600160a01b03163314611d8c5733611278565b5f82815260058501602052604090205460a0820151611dbb91600160b01b90046001600160401b0316906157fe565b6001600160401b0316421015611def5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0457611e046151ce565b03611f325760028401546080840151611e26916001600160401b0316906157fe565b6001600160401b0316421015611e5a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e6c57611e6a828761249e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ea5918491611ea0919061581e565b613817565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee68461396e565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611f4757611f476151ce565b03611f7b57611f558361396e565b5f898152600786016020526040902055611f6e88612cfd565b6001945050505050611661565b805160405163170cc93360e21b815261063c9190600401615360565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561204a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120719190810190615849565b915091508061209357604051636b2f19e960e01b815260040160405180910390fd5b8151156120b9578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120f5576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213157815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b60028110156121805761214881600161591b565b612153906008615715565b61ffff168482815181106121695761216961540b565b016020015160f81c901b9190911790600101612134565b5061ffff8116156121aa5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612205576121c181600361591b565b6121cc906008615715565b63ffffffff16856121de8360026156e0565b815181106121ee576121ee61540b565b016020015160f81c901b91909117906001016121ad565b5063ffffffff81161561222b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122805761224281601f61591b565b61224d906008615715565b866122598360066156e0565b815181106122695761226961540b565b016020015160f81c901b919091179060010161222e565b50949350505050565b60605f808335602085013560146122a5878701604089016153ab565b6122b260608901896153c6565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61233860608501856153c6565b90508110156120f5578161234f60608601866153c6565b8381811061235f5761235f61540b565b9050602002810190612371919061541f565b61237b908061592e565b905061238a60608701876153c6565b8481811061239a5761239a61540b565b90506020028101906123ac919061541f565b6123b6908061592e565b6123c360608901896153c6565b868181106123d3576123d361540b565b90506020028101906123e5919061541f565b6123f390602081019061592e565b61240060608b018b6153c6565b888181106124105761241061540b565b9050602002810190612422919061541f565b612433906060810190604001615139565b6040516020016124499796959493929190615970565b60408051601f19818403018152919052915060010161232b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125109190810190615849565b915091508061253257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612575573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125999190615380565b8251146125bf578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125fb576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f8061260a8460400151613b0b565b915091508187146126315760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615cbe833981519152906001600160401b0390811690831611156126ee575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261270d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615cbe8339815191528161273186613cfc565b905061273c86612463565b61274b57600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127705733611278565b5f86815260058301602052604090205460a082015161279f91600160b01b90046001600160401b0316906157fe565b6001600160401b03168160c001516001600160401b031610156127e65760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127fe576127f7878661249e565b905061281c565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061284190611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156128aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ce9190615380565b905080846008015f8a81526020019081526020015f205f8282546128f291906156e0565b90915550501515979650505050505050565b5f80516020615d1e83398151915280546001190161293557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612944614fac565b5f80516020615cde8339815191525f806129606114c787611fe6565b91509150801561298757604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156129b8576129b86151ce565b60058111156129c9576129c96151ce565b81526020016001820180546129dd9061532e565b80601f0160208091040260200160405190810160405280929190818152602001828054612a099061532e565b8015612a545780601f10612a2b57610100808354040283529160200191612a54565b820191905f5260205f20905b815481529060010190602001808311612a3757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612abf57612abf6151ce565b14158015612ae05750600181516005811115612add57612add6151ce565b14155b15612b0157805160405163170cc93360e21b815261063c9190600401615360565b600381516005811115612b1657612b166151ce565b03612b245760048152612b29565b600581525b836008018160200151604051612b3f91906155bc565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b8357612b836151ce565b021790555060208201516001820190612b9c9082615611565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612c4257612c426151ce565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612cc5575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613fe0565b60015f80516020615d1e83398151915255565b5f8181525f80516020615cfe8339815191526020526040808220815160e0810190925280545f80516020615cbe83398151915293929190829060ff166003811115612d4a57612d4a6151ce565b6003811115612d5b57612d5b6151ce565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612df87fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b8260800151612e0791906157fe565b6001600160401b0316421015612e3b5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b5f848152600684016020908152604080832080546001600160a81b03191681556001810184905560020183905560078601909152812080549082905590808215612ef6575f84815260058701602052604090205461271090612ea890600160a01b900461ffff1685615715565b612eb2919061572c565b915081866008015f8681526020019081526020015f205f828254612ed691906156e0565b90915550612ee69050828461591b565b9050612ef6856020015182612c79565b612f0b8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f8857835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612fd757612f9f81600161591b565b612faa906008615715565b61ffff16868281518110612fc057612fc061540b565b016020015160f81c901b9190911790600101612f8b565b5061ffff8116156130015760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561305c5761301881600361591b565b613023906008615715565b63ffffffff16876130358360026156e0565b815181106130455761304561540b565b016020015160f81c901b9190911790600101613004565b5063ffffffff811660031461308457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130d95761309b81601f61591b565b6130a6906008615715565b886130b28360066156e0565b815181106130c2576130c261540b565b016020015160f81c901b9190911790600101613087565b505f805b6008811015613138576130f181600761591b565b6130fc906008615715565b6001600160401b0316896131118360266156e0565b815181106131215761312161540b565b016020015160f81c901b91909117906001016130dd565b505f805b60088110156131975761315081600761591b565b61315b906008615715565b6001600160401b03168a61317083602e6156e0565b815181106131805761318061540b565b016020015160f81c901b919091179060010161313c565b5091989097509095509350505050565b5f8082516027146131dd57825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b600281101561322c576131f481600161591b565b6131ff906008615715565b61ffff168582815181106132155761321561540b565b016020015160f81c901b91909117906001016131e0565b5061ffff8116156132565760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156132b15761326d81600361591b565b613278906008615715565b63ffffffff168661328a8360026156e0565b8151811061329a5761329a61540b565b016020015160f81c901b9190911790600101613259565b5063ffffffff81166002146132d957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561332e576132f081601f61591b565b6132fb906008615715565b876133078360066156e0565b815181106133175761331761540b565b016020015160f81c901b91909117906001016132dc565b505f866026815181106133435761334361540b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615cbe83398151915290600160401b900461ffff90811690861610806133b7575061271061ffff8616115b156133db57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613417576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806134295750806001015483115b1561344a5760405163222d164360e21b81526004810184905260240161063c565b825f61345582610e01565b90505f6134628983614073565b905060405180608001604052806134763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6135396145eb565b610f2481614636565b5f5f80516020615cbe8339815191528161355b84610e01565b90505f61356787611a9c565b905061357287612463565b613592576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156135a7576135a76151ce565b146135c857805160405163170cc93360e21b815261063c9190600401615360565b5f8282608001516135d991906157fe565b905083600201600a9054906101000a90046001600160401b0316826040015161360291906159d9565b6001600160401b0316816001600160401b0316111561363f57604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f8061364b8a84613817565b915091505f8a8360405160200161367992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561370c5761370c6151ce565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d3e833981519152602052604081206002015481905f80516020615cde83398151915290600160801b90046001600160401b031661385f85826146aa565b5f613869876148cd565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6138b98a858b611f97565b6040518263ffffffff1660e01b81526004016138d5919061536e565b6020604051808303815f875af11580156138f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139159190615380565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615cbe83398151915290505f61398e8460400151611a9c565b90505f6003825160058111156139a6576139a66151ce565b14806139c457506004825160058111156139c2576139c26151ce565b145b156139d4575060c0810151613a11565b6002825160058111156139e9576139e96151ce565b036139f5575042613a11565b815160405163170cc93360e21b815261063c9190600401615360565b84608001516001600160401b0316816001600160401b031611613a3857505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f90613a5d90611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613ade573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b029190615380565b95945050505050565b5f808251602e14613b4157825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b9057613b5881600161591b565b613b63906008615715565b61ffff16858281518110613b7957613b7961540b565b016020015160f81c901b9190911790600101613b44565b5061ffff811615613bba5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613c1557613bd181600361591b565b613bdc906008615715565b63ffffffff1686613bee8360026156e0565b81518110613bfe57613bfe61540b565b016020015160f81c901b9190911790600101613bbd565b5063ffffffff811615613c3b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c9057613c5281601f61591b565b613c5d906008615715565b87613c698360066156e0565b81518110613c7957613c7961540b565b016020015160f81c901b9190911790600101613c3e565b505f805b6008811015613cef57613ca881600761591b565b613cb3906008615715565b6001600160401b031688613cc88360266156e0565b81518110613cd857613cd861540b565b016020015160f81c901b9190911790600101613c94565b5090969095509350505050565b613d04614fac565b5f8281525f80516020615d3e8339815191526020526040808220815160e0810190925280545f80516020615cde83398151915293929190829060ff166005811115613d5157613d516151ce565b6005811115613d6257613d626151ce565b8152602001600182018054613d769061532e565b80601f0160208091040260200160405190810160405280929190818152602001828054613da29061532e565b8015613ded5780601f10613dc457610100808354040283529160200191613ded565b820191905f5260205f20905b815481529060010190602001808311613dd057829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613e5b57613e5b6151ce565b14613e8e575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff1690600401615360565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ed257613ed26151ce565b021790555060208201516001820190613eeb9082615611565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f898582613817565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b804710156140035760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461404c576040519150601f19603f3d011682016040523d82523d5f602084013e614051565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140b757604051637fab81e560e01b815260040160405180910390fd5b5f80516020615cde833981519152426140d66060860160408701615139565b6001600160401b031611158061411057506140f46202a300426156e0565b6141046060860160408701615139565b6001600160401b031610155b1561414a576141256060850160408601615139565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61415f61415a6060860186615a04565b614942565b61416f61415a6080860186615a04565b603061417e602086018661592e565b9050146141b057614192602085018561592e565b6040516326475b2f60e11b815261063c925060040190815260200190565b6141ba848061592e565b90505f036141e7576141cc848061592e565b604051633e08a12560e11b815260040161063c929190615a18565b5f600882016141f6868061592e565b6040516142049291906157ef565b9081526020016040518091039020541461423d57614222848061592e565b60405163a41f772f60e01b815260040161063c929190615a18565b614247835f6146aa565b6040805160e08101909152815481525f908190614353906020810161426c898061592e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906142b4908a018a61592e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016142fd60608a0160408b01615139565b6001600160401b0316815260200161431860608a018a615a04565b61432190615a46565b815260200161433360808a018a615a04565b61433c90615a46565b8152602001876001600160401b0316815250614aab565b5f828152600686016020526040902091935091506143718282615611565b508160088401614381888061592e565b60405161438f9291906157ef565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143cb90859060040161536e565b6020604051808303815f875af11580156143e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061440b9190615380565b6040805160e08101909152909150806001815260200161442b898061592e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156144ba576144ba6151ce565b0217905550602082015160018201906144d39082615611565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580614571888061592e565b60405161457f9291906157ef565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145bd9190615139565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661463457604051631afcd79f60e31b815260040160405180910390fd5b565b61463e6145eb565b61464781614c98565b61464f614cb1565b610f246060820135608083013561466c60c0850160a08601615139565b61467c60e0860160c08701615b0d565b61468d610100870160e08801615b26565b6101008701356146a561014089016101208a016153ab565b614cc1565b5f80516020615cde8339815191525f6001600160401b0380841690851611156146de576146d7838561581e565b90506146eb565b6146e8848461581e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061474d575060018401548151614749916001600160401b0316906156e0565b8210155b15614773576001600160401b038316606082015281815260408101516020820152614792565b828160600181815161478591906157fe565b6001600160401b03169052505b60608101516147a29060646159d9565b602082015160018601546001600160401b0392909216916147cd9190600160401b900460ff16615715565b10156147fd57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b03168160400181815161481891906156e0565b9052506040810180516001600160401b038716919061483890839061591b565b9052506001840154604082015160649161485d91600160401b90910460ff1690615715565b1015614884578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d3e8339815191526020526040812060020180545f80516020615cde833981519152919060089061491790600160401b90046001600160401b0316615b46565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61494f60208201826150e2565b63ffffffff1615801561496f575061496a60208201826153c6565b151590505b156149b65761498160208201826150e2565b61498e60208301836153c6565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149c360208201826153c6565b90506149d260208301836150e2565b63ffffffff1611156149eb5761498160208201826150e2565b60015b6149fb60208301836153c6565b90508110156114a757614a1160208301836153c6565b614a1c60018461591b565b818110614a2b57614a2b61540b565b9050602002016020810190614a4091906153ab565b6001600160a01b0316614a5660208401846153c6565b83818110614a6657614a6661540b565b9050602002016020810190614a7b91906153ab565b6001600160a01b03161015614aa357604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149ee565b5f6060826040015151603014614ad45760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b15988a986001989297929690959094909390929101615b61565b60405160208183030381529060405290505f5b84608001516020015151811015614b8757818560800151602001518281518110614b5457614b5461540b565b6020026020010151604051602001614b6d929190615c1b565b60408051601f198184030181529190529150600101614b28565b5060a0840151805160209182015151604051614ba7938593929101615c51565b60405160208183030381529060405290505f5b8460a001516020015151811015614c1957818560a00151602001518281518110614be657614be661540b565b6020026020010151604051602001614bff929190615c1b565b60408051601f198184030181529190529150600101614bba565b5060c0840151604051614c30918391602001615c8c565b6040516020818303038152906040529050600281604051614c5191906155bc565b602060405180830381855afa158015614c6c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c8f9190615380565b94909350915050565b614ca06145eb565b614ca8614e7d565b610f2481614e85565b614cb96145eb565b614634614f6d565b614cc96145eb565b5f80516020615cbe83398151915261ffff85161580614ced575061271061ffff8616115b15614d1157604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614d355760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614d485750600a60ff8516115b15614d6b5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614dd2576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614df25760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6146346145eb565b614e8d6145eb565b80355f80516020615cde8339815191529081556014614eb26060840160408501615b26565b60ff161180614ed15750614ecc6060830160408401615b26565b60ff16155b15614f0557614ee66060830160408401615b26565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614f156060830160408401615b26565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f466040830160208401615139565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612cea6145eb565b508054614f819061532e565b5f825580601f10614f90575050565b601f0160209004905f5260205f2090810190610f249190614fe9565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ffd575f8155600101614fea565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215615033575f80fd5b83359250602084013561504581615001565b91506150536040850161500e565b90509250925092565b5f6020828403121561506c575f80fd5b5035919050565b5f8060408385031215615084575f80fd5b82356001600160401b03811115615099575f80fd5b8301608081860312156150aa575f80fd5b91506150b86020840161500e565b90509250929050565b5f80604083850312156150d2575f80fd5b823591506150b86020840161500e565b5f602082840312156150f2575f80fd5b6116618261500e565b5f806040838503121561510c575f80fd5b6151158361500e565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f60208284031215615149575f80fd5b61166182615123565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615175575f80fd5b83356001600160401b0381111561518a575f80fd5b840160a0818703121561519b575f80fd5b92506151a960208501615152565b915061505360408501615123565b5f61014082840312156151c8575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106151f2576151f26151ce565b9052565b5f5b838110156152105781810151838201526020016151f8565b50505f910152565b5f815180845261522f8160208601602086016151f6565b601f01601f19169290920160200192915050565b602081526152556020820183516151e2565b5f602083015160e06040840152615270610100840182615218565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156152d4575f80fd5b82356001600160401b03808211156152ea575f80fd5b818501915085601f8301126152fd575f80fd5b81358181111561530b575f80fd5b86602082850101111561531c575f80fd5b60209290920196919550909350505050565b600181811c9082168061534257607f821691505b6020821081036151c857634e487b7160e01b5f52602260045260245ffd5b60208101610e5582846151e2565b602081525f6116616020830184615218565b5f60208284031215615390575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f602082840312156153bb575f80fd5b813561166181615397565b5f808335601e198436030181126153db575f80fd5b8301803591506001600160401b038211156153f4575f80fd5b6020019150600581901b3603821315613967575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615433575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154735761547361543d565b60405290565b604080519081016001600160401b03811182821017156154735761547361543d565b604051601f8201601f191681016001600160401b03811182821017156154c3576154c361543d565b604052919050565b5f6001600160401b038211156154e3576154e361543d565b50601f01601f191660200190565b5f82601f830112615500575f80fd5b813561551361550e826154cb565b61549b565b818152846020838601011115615527575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615553575f80fd5b61555b615451565b82356001600160401b0380821115615571575f80fd5b61557d368387016154f1565b83526020850135915080821115615592575f80fd5b5061559f368286016154f1565b6020830152506155b160408401615123565b604082015292915050565b5f82516154338184602087016151f6565b601f82111561064557805f5260205f20601f840160051c810160208510156155f25750805b601f840160051c820191505b8181101561184a575f81556001016155fe565b81516001600160401b0381111561562a5761562a61543d565b61563e81615638845461532e565b846155cd565b602080601f831160018114615671575f841561565a5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b8281101561569f57888601518255948401946001909101908401615680565b50858210156156bc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e556156cc565b5f63ffffffff80831681810361570b5761570b6156cc565b6001019392505050565b8082028115828204841417610e5557610e556156cc565b5f8261574657634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061575f5761575f6151ce565b91905290565b5f60208083525f84546157778161532e565b806020870152604060018084165f811461579857600181146157b4576157e1565b60ff19851660408a0152604084151560051b8a010195506157e1565b895f5260205f205f5b858110156157d85781548b82018601529083019088016157bd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120f5576120f56156cc565b6001600160401b038281168282160390808211156120f5576120f56156cc565b8051611a9781615001565b5f806040838503121561585a575f80fd5b82516001600160401b0380821115615870575f80fd5b9084019060608287031215615883575f80fd5b61588b615451565b8251815260208084015161589e81615397565b828201526040840151838111156158b3575f80fd5b80850194505087601f8501126158c7575f80fd5b835192506158d761550e846154cb565b83815288828587010111156158ea575f80fd5b6158f9848383018488016151f6565b8060408401525081955061590e81880161583e565b9450505050509250929050565b81810381811115610e5557610e556156cc565b5f808335601e19843603018112615943575f80fd5b8301803591506001600160401b0382111561595c575f80fd5b602001915036819003821315613967575f80fd5b5f8851615981818460208d016151f6565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146159fc576159fc6156cc565b505092915050565b5f8235603e19833603018112615433575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a56575f80fd5b615a5e615479565b615a678361500e565b81526020808401356001600160401b0380821115615a83575f80fd5b9085019036601f830112615a95575f80fd5b813581811115615aa757615aa761543d565b8060051b9150615ab884830161549b565b8181529183018401918481019036841115615ad1575f80fd5b938501935b83851015615afb5784359250615aeb83615397565b8282529385019390850190615ad6565b94860194909452509295945050505050565b5f60208284031215615b1d575f80fd5b61166182615152565b5f60208284031215615b36575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b0380831681810361570b5761570b6156cc565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615ba781602a850160208b016151f6565b865190830190615bbe81602a840160208b016151f6565b60c087901b6001600160c01b031916602a9290910191820152615bf0603282018660e01b6001600160e01b0319169052565b615c09603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c2c8184602088016151f6565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c628184602089016151f6565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615c9d8184602088016151f6565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615c4c380380615c4c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615aff8061014d5f395ff3fe6080604052600436106101b5575f3560e01c80638280a25a116100ea578063ba3a4b971161008e578063ba3a4b97146104dc578063bc5fbfec146104fb578063bee0a03f1461052e578063c257a0f51461054d578063c599e24f1461056c578063c974d1b61461057f578063d5f20ff614610593578063df93d8de146105bf578063fd7ac5e7146105d5575f80fd5b80638280a25a1461040b57806393e245981461041f57806398f3e2b41461043e578063a3a65e481461045d578063a9778a7a146102df578063af2f5feb1461047c578063afb980961461048f578063b771b3bc146104c2575f80fd5b806335455ded1161015c57806335455ded146102df5780633a1cfff614610307578063467ef06f146103265780635297fae61461034557806360305d6214610364578063620658561461038d57806366435abf146103ba578063732214f8146103d957806376f78621146103ec575f80fd5b80630118acc4146101b95780630322ed98146101da578063151d30d1146101f95780631ec447241461022457806320d91b7a1461024357806325e1c776146102625780632e2194d814610281578063329c3e12146102b8575b5f80fd5b3480156101c4575f80fd5b506101d86101d3366004614e19565b6105f4565b005b3480156101e5575f80fd5b506101d86101f4366004614e54565b610629565b348015610204575f80fd5b5061020d600a81565b60405160ff90911681526020015b60405180910390f35b34801561022f575f80fd5b506101d861023e366004614e19565b61082c565b34801561024e575f80fd5b506101d861025d366004614e6b565b610837565b34801561026d575f80fd5b506101d861027c366004614eb9565b610d35565b34801561028c575f80fd5b506102a061029b366004614e54565b610da9565b6040516001600160401b03909116815260200161021b565b3480156102c3575f80fd5b506102d26001600160991b0181565b60405161021b9190614eda565b3480156102ea575f80fd5b506102f461271081565b60405161ffff909116815260200161021b565b348015610312575f80fd5b506101d8610321366004614e19565b610dfd565b348015610331575f80fd5b506101d8610340366004614eee565b610e08565b348015610350575f80fd5b506101d861035f366004614f07565b610eb8565b34801561036f575f80fd5b50610378601481565b60405163ffffffff909116815260200161021b565b348015610398575f80fd5b506103ac6103a7366004614f45565b611113565b60405190815260200161021b565b3480156103c5575f80fd5b506102a06103d4366004614e54565b611133565b3480156103e4575f80fd5b506103ac5f81565b3480156103f7575f80fd5b506101d8610406366004614e19565b611147565b348015610416575f80fd5b5061020d603081565b34801561042a575f80fd5b506101d8610439366004614e54565b611172565b348015610449575f80fd5b506101d8610458366004614f07565b61122f565b348015610468575f80fd5b506101d8610477366004614eee565b6113ee565b6103ac61048a366004614f6f565b611574565b34801561049a575f80fd5b506103ac7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b3480156104cd575f80fd5b506102d26005600160991b0181565b3480156104e7575f80fd5b506101d86104f6366004614e54565b61159a565b348015610506575f80fd5b506103ac7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b348015610539575f80fd5b506101d8610548366004614e54565b611778565b348015610558575f80fd5b506101d8610567366004614fc3565b611895565b6103ac61057a366004614e54565b611972565b34801561058a575f80fd5b5061020d601481565b34801561059e575f80fd5b506105b26105ad366004614e54565b611995565b60405161021b919061504f565b3480156105ca575f80fd5b506102a06202a30081565b3480156105e0575f80fd5b506103ac6105ef3660046150cf565b611ad7565b6105ff838383611b0f565b61062457604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f610632611e55565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff16600581111561066b5761066b614fda565b600581111561067c5761067c614fda565b81526020016001820180546106909061513a565b80601f01602080910402602001604051908101604052809291908181526020018280546106bc9061513a565b80156107075780601f106106de57610100808354040283529160200191610707565b820191905f5260205f20905b8154815290600101906020018083116106ea57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561077257610772614fda565b146107a5575f8381526007830160205260409081902054905163170cc93360e21b815261061b9160ff169060040161516c565b6005600160991b016001600160a01b031663ee5b48eb6107ca8584606001515f611e79565b6040518263ffffffff1660e01b81526004016107e6919061517a565b6020604051808303815f875af1158015610802573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610826919061518c565b50505050565b610826838383611b0f565b5f610840611e55565b600981015490915060ff161561086957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d0919061518c565b8360200135146108f9576040516372b0a7e760e11b81526020840135600482015260240161061b565b3061090a60608501604086016151b7565b6001600160a01b0316146109425761092860608401604085016151b7565b604051632f88120d60e21b815260040161061b9190614eda565b5f61095060608501856151d2565b905090505f805b828163ffffffff161015610c37575f61097360608801886151d2565b8363ffffffff1681811061098957610989615217565b905060200281019061099b919061522b565b6109a49061534f565b80516040519192505f9160088801916109bc916153c8565b908152602001604051809103902054146109ec57805160405163a41f772f60e01b815261061b919060040161517a565b5f6002885f013584604051602001610a1b92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a35916153c8565b602060405180830381855afa158015610a50573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a73919061518c565b90508086600801835f0151604051610a8b91906153c8565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b0d57610b0d614fda565b021790555060208201516001820190610b26908261541d565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090930151600390920180546001600160401b03191692841692909217909155830151610bca9116856154ec565b8251604051919550610bdb916153c8565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c30906154ff565b9050610957565b50600483018190556001830154606490610c5b90600160401b900460ff1683615521565b1015610c7d57604051635943317f60e01b81526004810182905260240161061b565b5f610c93610c8a86611ec8565b60400151611fd3565b90505f610c9f87612160565b90505f600282604051610cb291906153c8565b602060405180830381855afa158015610ccd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cf0919061518c565b9050828114610d1c57604051631872fc8d60e01b8152600481018290526024810184905260440161061b565b5050506009909201805460ff1916600117905550505050565b610d3e82612335565b610d5e576040516330efa98b60e01b81526004810183905260240161061b565b5f610d6883611995565b5190506002816005811115610d7f57610d7f614fda565b14610d9f578060405163170cc93360e21b815260040161061b919061516c565b610826838361235e565b5f80610db36125ac565b60030154610dc19084615538565b9050801580610dd657506001600160401b0381115b15610df75760405163222d164360e21b81526004810184905260240161061b565b92915050565b6108268383836125d0565b610e1061279b565b5f610e196125ac565b90505f80610e26846127e5565b91509150610e3382612335565b610e3f57505050610ead565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610e6d57610e6d614fda565b03610e92575f83815260088501602052604081208054919055610e908282612b1f565b505b610ea881610ea38460400151611113565b612b7d565b505050505b610eb5612b90565b50565b5f610ec16125ac565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115610efa57610efa614fda565b6003811115610f0b57610f0b614fda565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610f8182611995565b9050600183516003811115610f9857610f98614fda565b14610fb9578251604051633b0d540d60e21b815261061b9190600401615557565b600481516005811115610fce57610fce614fda565b03610fe457610fdc85612bb6565b505050505050565b5f80610ffb610ff289611ec8565b60400151612dd6565b509150915081841461102857846040015160405163089938b360e11b815260040161061b91815260200190565b806001600160401b031683606001516001600160401b031610806110615750806001600160401b03168560a001516001600160401b0316115b1561108a57604051632e19bc2d60e11b81526001600160401b038216600482015260240161061b565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b19909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f61111c6125ac565b60030154610df7906001600160401b038416615521565b5f61113d82611995565b6080015192915050565b6111528383836125d0565b61062457604051635bff683f60e11b81526004810184905260240161061b565b5f61117b6125ac565b90505f61118783611995565b519050600481600581111561119e5761119e614fda565b146111be578060405163170cc93360e21b815260040161061b919061516c565b5f8381526005830160205260409020546001600160a01b031633146111f957335b604051636e2ccd7560e11b815260040161061b9190614eda565b5f83815260088301602090815260408083208054908490556005860190925290912054610826906001600160a01b031682612b1f565b61123761279b565b5f6112406125ac565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff16600381111561127957611279614fda565b600381111561128a5761128a614fda565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561130357611303614fda565b14611324578051604051633b0d540d60e21b815261061b9190600401615557565b60046113338260400151611995565b51600581111561134557611345614fda565b146113d7575f61135485611ec8565b90505f806113658360400151612dd6565b5091509150818460400151146113915760405163089938b360e11b81526004810183905260240161061b565b806001600160401b03168460c001516001600160401b031611156113d357604051632e19bc2d60e11b81526001600160401b038216600482015260240161061b565b5050505b6113e083612bb6565b50506113ea612b90565b5050565b5f6113f7611e55565b90505f8061141061140785611ec8565b6040015161302c565b915091508061143657604051632d07135360e01b8152811515600482015260240161061b565b5f828152600684016020526040902080546114509061513a565b90505f036114745760405163089938b360e11b81526004810183905260240161061b565b60015f83815260078501602052604090205460ff16600581111561149a5761149a614fda565b146114cd575f8281526007840160205260409081902054905163170cc93360e21b815261061b9160ff169060040161516c565b5f82815260068401602052604081206114e591614d6d565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61157d61279b565b611589848484346131e8565b9050611593612b90565b9392505050565b5f6115a36125ac565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff1660038111156115dc576115dc614fda565b60038111156115ed576115ed614fda565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561166657611666614fda565b14158015611687575060038151600381111561168457611684614fda565b14155b156116a8578051604051633b0d540d60e21b815261061b9190600401615557565b5f6116b68260400151611995565b905080606001516001600160401b03165f036116e8576040516339b894f960e21b81526004810185905260240161061b565b6005600160991b016001600160a01b031663ee5b48eb611715846040015184606001518560800151611e79565b6040518263ffffffff1660e01b8152600401611731919061517a565b6020604051808303815f875af115801561174d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611771919061518c565b5050505050565b5f611781611e55565b5f838152600682016020526040902080549192509061179f9061513a565b90505f036117c35760405163089938b360e11b81526004810183905260240161061b565b60015f83815260078301602052604090205460ff1660058111156117e9576117e9614fda565b1461181c575f8281526007820160205260409081902054905163170cc93360e21b815261061b9160ff169060040161516c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118559190600401615571565b6020604051808303815f875af1158015611871573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610624919061518c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806118de575080546001600160401b03808416911610155b156118fc5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561192683613394565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f61197b61279b565b6119868233346133a5565b9050611990612b90565b919050565b61199d614da4565b5f6119a6611e55565b5f84815260078201602052604090819020815160e0810190925280549293509091829060ff1660058111156119dd576119dd614fda565b60058111156119ee576119ee614fda565b8152602001600182018054611a029061513a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2e9061513a565b8015611a795780601f10611a5057610100808354040283529160200191611a79565b820191905f5260205f20905b815481529060010190602001808311611a5c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b5f80611ae1611e55565b9050806008018484604051611af79291906155fb565b90815260200160405180910390205491505092915050565b5f80611b196125ac565b5f868152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115611b5257611b52614fda565b6003811115611b6357611b63614fda565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bd982611995565b9050600283516003811115611bf057611bf0614fda565b14611c11578251604051633b0d540d60e21b815261061b9190600401615557565b60208301516001600160a01b03163314611cad575f8281526005850160205260409020546001600160a01b03163314611c4a57336111df565b5f82815260058501602052604090205460a0820151611c7991600160b01b90046001600160401b03169061560a565b6001600160401b0316421015611cad5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161061b565b600281516005811115611cc257611cc2614fda565b03611df05760028401546080840151611ce4916001600160401b03169061560a565b6001600160401b0316421015611d185760405163fb6ce63f60e01b81526001600160401b034216600482015260240161061b565b8615611d2a57611d28828761235e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d63918491611d5e919061562a565b613677565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611da4846137c1565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506115939350505050565b600481516005811115611e0557611e05614fda565b03611e3957611e13836137c1565b5f898152600786016020526040902055611e2c88612bb6565b6001945050505050611593565b805160405163170cc93360e21b815261061b919060040161516c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f2c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f539190810190615655565b9150915080611f7557604051636b2f19e960e01b815260040160405180910390fd5b815115611f9b578151604051636ba589a560e01b8152600481019190915260240161061b565b60208201516001600160a01b031615611fcc578160200151604051624de75d60e31b815260040161061b9190614eda565b5092915050565b5f815160261461200857815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161061b565b5f805b60028110156120575761201f816001615727565b61202a906008615521565b61ffff1684828151811061204057612040615217565b016020015160f81c901b919091179060010161200b565b5061ffff8116156120815760405163407b587360e01b815261ffff8216600482015260240161061b565b5f805b60048110156120dc57612098816003615727565b6120a3906008615521565b63ffffffff16856120b58360026154ec565b815181106120c5576120c5615217565b016020015160f81c901b9190911790600101612084565b5063ffffffff81161561210257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156121575761211981601f615727565b612124906008615521565b866121308360066154ec565b8151811061214057612140615217565b016020015160f81c901b9190911790600101612105565b50949350505050565b60605f8083356020850135601461217c878701604089016151b7565b61218960608901896151d2565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6001600160601b03191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61220a60608501856151d2565b9050811015611fcc578161222160608601866151d2565b8381811061223157612231615217565b9050602002810190612243919061522b565b61224d908061573a565b905061225c60608701876151d2565b8481811061226c5761226c615217565b905060200281019061227e919061522b565b612288908061573a565b61229560608901896151d2565b868181106122a5576122a5615217565b90506020028101906122b7919061522b565b6122c590602081019061573a565b6122d260608b018b6151d2565b888181106122e2576122e2615217565b90506020028101906122f4919061522b565b612305906060810190604001614f45565b60405160200161231b979695949392919061577c565b60408051601f1981840301815291905291506001016121fd565b5f8061233f6125ac565b5f938452600501602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156123a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123d09190810190615655565b91509150806123f257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612435573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612459919061518c565b82511461247f578151604051636ba589a560e01b8152600481019190915260240161061b565b60208201516001600160a01b0316156124b0578160200151604051624de75d60e31b815260040161061b9190614eda565b5f806124bf8460400151613944565b915091508187146124e65760405163089938b360e11b81526004810188905260240161061b565b5f6124ef6125ac565b5f8981526005820160205260409020600101549091506001600160401b039081169083161115612582575f88815260058201602090815260409182902060010180546001600160401b0319166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125a1565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f806125da6125ac565b90505f6125e686613b35565b90506125f186612335565b61260057600192505050611593565b5f8681526005830160205260409020546001600160a01b0316331461262557336111df565b5f86815260058301602052604090205460a082015161265491600160b01b90046001600160401b03169061560a565b6001600160401b03168160c001516001600160401b0316101561269b5760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161061b565b5f85156126b3576126ac878661235e565b90506126d1565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126f690611113565b60a086015160c08701516040516001600160e01b031960e086901b168152612726939291829189906004016157e5565b602060405180830381865afa158015612741573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612765919061518c565b905080846008015f8a81526020019081526020015f205f82825461278991906154ec565b90915550501515979650505050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016127df57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127ee614da4565b5f6127f7611e55565b90505f8061280761140787611ec8565b91509150801561282e57604051632d07135360e01b8152811515600482015260240161061b565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285f5761285f614fda565b600581111561287057612870614fda565b81526020016001820180546128849061513a565b80601f01602080910402602001604051908101604052809291908181526020018280546128b09061513a565b80156128fb5780601f106128d2576101008083540402835291602001916128fb565b820191905f5260205f20905b8154815290600101906020018083116128de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561296657612966614fda565b14158015612987575060018151600581111561298457612984614fda565b14155b156129a857805160405163170cc93360e21b815261061b919060040161516c565b6003815160058111156129bd576129bd614fda565b036129cb57600481526129d0565b600581525b8360080181602001516040516129e691906153c8565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2a57612a2a614fda565b021790555060208201516001820190612a43908261541d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b0319169190921617905580516005811115612ae857612ae8614fda565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612b6b575f80fd5b505af1158015610fdc573d5f803e3d5ffd5b6113ea6001600160a01b03831682613e0d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f612bbf6125ac565b5f838152600682016020526040808220815160e0810190925280549394509192909190829060ff166003811115612bf857612bf8614fda565b6003811115612c0957612c09614fda565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612c7d613ea0565b8260800151612c8c919061560a565b6001600160401b0316421015612cc05760405163fb6ce63f60e01b81526001600160401b034216600482015260240161061b565b5f848152600684016020908152604080832080546001600160a81b03191681556001810184905560020183905560078601909152812080549082905590808215612d7b575f84815260058701602052604090205461271090612d2d90600160a01b900461ffff1685615521565b612d379190615538565b915081866008015f8681526020019081526020015f205f828254612d5b91906154ec565b90915550612d6b90508284615727565b9050612d7b856020015182612b1f565b612d908560200151610ea38760600151611113565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e0d57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161061b565b5f805b6002811015612e5c57612e24816001615727565b612e2f906008615521565b61ffff16868281518110612e4557612e45615217565b016020015160f81c901b9190911790600101612e10565b5061ffff811615612e865760405163407b587360e01b815261ffff8216600482015260240161061b565b5f805b6004811015612ee157612e9d816003615727565b612ea8906008615521565b63ffffffff1687612eba8360026154ec565b81518110612eca57612eca615217565b016020015160f81c901b9190911790600101612e89565b5063ffffffff8116600314612f0957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f5e57612f2081601f615727565b612f2b906008615521565b88612f378360066154ec565b81518110612f4757612f47615217565b016020015160f81c901b9190911790600101612f0c565b505f805b6008811015612fbd57612f76816007615727565b612f81906008615521565b6001600160401b031689612f968360266154ec565b81518110612fa657612fa6615217565b016020015160f81c901b9190911790600101612f62565b505f805b600881101561301c57612fd5816007615727565b612fe0906008615521565b6001600160401b03168a612ff583602e6154ec565b8151811061300557613005615217565b016020015160f81c901b9190911790600101612fc1565b5091989097509095509350505050565b5f80825160271461306257825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161061b565b5f805b60028110156130b157613079816001615727565b613084906008615521565b61ffff1685828151811061309a5761309a615217565b016020015160f81c901b9190911790600101613065565b5061ffff8116156130db5760405163407b587360e01b815261ffff8216600482015260240161061b565b5f805b6004811015613136576130f2816003615727565b6130fd906008615521565b63ffffffff168661310f8360026154ec565b8151811061311f5761311f615217565b016020015160f81c901b91909117906001016130de565b5063ffffffff811660021461315e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131b35761317581601f615727565b613180906008615521565b8761318c8360066154ec565b8151811061319c5761319c615217565b016020015160f81c901b9190911790600101613161565b505f866026815181106131c8576131c8615217565b016020015191976001600160f81b03199092161515965090945050505050565b5f806131f26125ac565b600281015490915061ffff600160401b9091048116908616108061321b575061271061ffff8616115b1561323f57604051635f12e6c360e11b815261ffff8616600482015260240161061b565b60028101546001600160401b03908116908516101561327b576040516202a06d60e11b81526001600160401b038516600482015260240161061b565b805483108061328d5750806001015483115b156132ae5760405163222d164360e21b81526004810184905260240161061b565b825f6132b982610da9565b90505f6132c68983613ebb565b905060405180608001604052806132da3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b0319909416951694909417919091179890981617815591015160019091018054919095166001600160401b0319909116179093555090915050949350505050565b61339c614418565b610eb581614463565b5f806133af6125ac565b90505f6133bb84610da9565b90505f6133c787611995565b90506133d287612335565b6133f2576040516330efa98b60e01b81526004810188905260240161061b565b60028151600581111561340757613407614fda565b1461342857805160405163170cc93360e21b815261061b919060040161516c565b5f828260800151613439919061560a565b905083600201600a9054906101000a90046001600160401b031682604001516134629190615813565b6001600160401b0316816001600160401b0316111561349f57604051636d51fe0560e11b81526001600160401b038216600482015260240161061b565b5f806134ab8a84613677565b915091505f8a836040516020016134d992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561356c5761356c614fda565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f805f613682611e55565b5f868152600782016020526040902060020154909150600160801b90046001600160401b03166136b285826144d7565b5f6136bc876146fc565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61370c8a858b611e79565b6040518263ffffffff1660e01b8152600401613728919061517a565b6020604051808303815f875af1158015613744573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613768919061518c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f806137cb6125ac565b90505f6137db8460400151611995565b90505f6003825160058111156137f3576137f3614fda565b1480613811575060048251600581111561380f5761380f614fda565b145b15613821575060c081015161385e565b60028251600581111561383657613836614fda565b0361384257504261385e565b815160405163170cc93360e21b815261061b919060040161516c565b84608001516001600160401b0316816001600160401b03161161388557505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138aa90611113565b60a085015160808901516040808b01515f90815260058a016020528190206001015490516001600160e01b031960e087901b1681526138fc9493929188916001600160401b03909116906004016157e5565b602060405180830381865afa158015613917573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393b919061518c565b95945050505050565b5f808251602e1461397a57825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161061b565b5f805b60028110156139c957613991816001615727565b61399c906008615521565b61ffff168582815181106139b2576139b2615217565b016020015160f81c901b919091179060010161397d565b5061ffff8116156139f35760405163407b587360e01b815261ffff8216600482015260240161061b565b5f805b6004811015613a4e57613a0a816003615727565b613a15906008615521565b63ffffffff1686613a278360026154ec565b81518110613a3757613a37615217565b016020015160f81c901b91909117906001016139f6565b5063ffffffff811615613a7457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613ac957613a8b81601f615727565b613a96906008615521565b87613aa28360066154ec565b81518110613ab257613ab2615217565b016020015160f81c901b9190911790600101613a77565b505f805b6008811015613b2857613ae1816007615727565b613aec906008615521565b6001600160401b031688613b018360266154ec565b81518110613b1157613b11615217565b016020015160f81c901b9190911790600101613acd565b5090969095509350505050565b613b3d614da4565b5f613b46611e55565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff166005811115613b7f57613b7f614fda565b6005811115613b9057613b90614fda565b8152602001600182018054613ba49061513a565b80601f0160208091040260200160405190810160405280929190818152602001828054613bd09061513a565b8015613c1b5780601f10613bf257610100808354040283529160200191613c1b565b820191905f5260205f20905b815481529060010190602001808311613bfe57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c8957613c89614fda565b14613cbc575f8481526007830160205260409081902054905163170cc93360e21b815261061b9160ff169060040161516c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d0057613d00614fda565b021790555060208201516001820190613d19908261541d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790555f613db68582613677565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613e30573060405163cd78605960e01b815260040161061b9190614eda565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613e79576040519150601f19603f3d011682016040523d82523d5f602084013e613e7e565b606091505b505090508061062457604051630a12f52160e11b815260040160405180910390fd5b5f613ea9611e55565b600101546001600160401b0316919050565b5f613ec4611e55565b6009015460ff16613ee857604051637fab81e560e01b815260040160405180910390fd5b5f613ef1611e55565b905042613f046060860160408701614f45565b6001600160401b0316111580613f3e5750613f226202a300426154ec565b613f326060860160408701614f45565b6001600160401b031610155b15613f7857613f536060850160408601614f45565b604051635879da1360e11b81526001600160401b03909116600482015260240161061b565b613f8d613f88606086018661583e565b614765565b613f9d613f88608086018661583e565b6030613fac602086018661573a565b905014613fde57613fc0602085018561573a565b6040516326475b2f60e11b815261061b925060040190815260200190565b613fe8848061573a565b90505f0361401557613ffa848061573a565b604051633e08a12560e11b815260040161061b929190615852565b5f60088201614024868061573a565b6040516140329291906155fb565b9081526020016040518091039020541461406b57614050848061573a565b60405163a41f772f60e01b815260040161061b929190615852565b614075835f6144d7565b6040805160e08101909152815481525f908190614181906020810161409a898061573a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906140e2908a018a61573a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161412b60608a0160408b01614f45565b6001600160401b0316815260200161414660608a018a61583e565b61414f90615880565b815260200161416160808a018a61583e565b61416a90615880565b8152602001876001600160401b03168152506148ce565b5f8281526006860160205260409020919350915061419f828261541d565b5081600884016141af888061573a565b6040516141bd9291906155fb565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141f990859060040161517a565b6020604051808303815f875af1158015614215573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614239919061518c565b6040805160e081019091529091508060018152602001614259898061573a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156142e8576142e8614fda565b021790555060208201516001820190614301908261541d565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790558061439e888061573a565b6040516143ac9291906155fb565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906143ea9190614f45565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661446157604051631afcd79f60e31b815260040160405180910390fd5b565b61446b614418565b61447481614abb565b61447c614ad4565b610eb56060820135608083013561449960c0850160a08601614f45565b6144a960e0860160c08701615947565b6144ba610100870160e08801615960565b6101008701356144d261014089016101208a016151b7565b614ae4565b5f6144e0611e55565b90505f826001600160401b0316846001600160401b0316111561450e57614507838561562a565b905061451b565b614518848461562a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061457d575060018401548151614579916001600160401b0316906154ec565b8210155b156145a3576001600160401b0383166060820152818152604081015160208201526145c2565b82816060018181516145b5919061560a565b6001600160401b03169052505b60608101516145d2906064615813565b602082015160018601546001600160401b0392909216916145fd9190600160401b900460ff16615521565b101561462d57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161061b565b856001600160401b03168160400181815161464891906154ec565b9052506040810180516001600160401b0387169190614668908390615727565b9052506001840154604082015160649161468d91600160401b90910460ff1690615521565b10156146b4578060400151604051635943317f60e01b815260040161061b91815260200190565b80516002850155602081015160038501556040810151600485015560600151600590930180546001600160401b0319166001600160401b039094169390931790925550505050565b5f80614706611e55565b5f848152600782016020526040902060020180549192509060089061473a90600160401b90046001600160401b0316615980565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147726020820182614eee565b63ffffffff16158015614792575061478d60208201826151d2565b151590505b156147d9576147a46020820182614eee565b6147b160208301836151d2565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161061b565b6147e660208201826151d2565b90506147f56020830183614eee565b63ffffffff16111561480e576147a46020820182614eee565b60015b61481e60208301836151d2565b90508110156113ea5761483460208301836151d2565b61483f600184615727565b81811061484e5761484e615217565b905060200201602081019061486391906151b7565b6001600160a01b031661487960208401846151d2565b8381811061488957614889615217565b905060200201602081019061489e91906151b7565b6001600160a01b031610156148c657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614811565b5f60608260400151516030146148f75760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614938988a98600198929792969095909490939092910161599b565b60405160208183030381529060405290505f5b846080015160200151518110156149aa5781856080015160200151828151811061497757614977615217565b6020026020010151604051602001614990929190615a55565b60408051601f19818403018152919052915060010161494b565b5060a08401518051602091820151516040516149ca938593929101615a86565b60405160208183030381529060405290505f5b8460a001516020015151811015614a3c57818560a00151602001518281518110614a0957614a09615217565b6020026020010151604051602001614a22929190615a55565b60408051601f1981840301815291905291506001016149dd565b5060c0840151604051614a53918391602001615ac1565b6040516020818303038152906040529050600281604051614a7491906153c8565b602060405180830381855afa158015614a8f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ab2919061518c565b94909350915050565b614ac3614418565b614acb614c7a565b610eb581614c82565b614adc614418565b614461614d65565b614aec614418565b5f614af56125ac565b905061ffff85161580614b0d575061271061ffff8616115b15614b3157604051635f12e6c360e11b815261ffff8616600482015260240161061b565b86881115614b555760405163222d164360e21b81526004810189905260240161061b565b60ff84161580614b685750600a60ff8516115b15614b8b5760405163170db35960e31b815260ff8516600482015260240161061b565b614b93613ea0565b6001600160401b0316866001600160401b03161015614bcf576040516202a06d60e11b81526001600160401b038716600482015260240161061b565b825f03614bef5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b614461614418565b614c8a614418565b5f614c93611e55565b8235815590506014614cab6060840160408501615960565b60ff161180614cca5750614cc56060830160408401615960565b60ff16155b15614cfe57614cdf6060830160408401615960565b604051634a59bbff60e11b815260ff909116600482015260240161061b565b614d0e6060830160408401615960565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d3f6040830160208401614f45565b60019190910180546001600160401b0319166001600160401b0390921691909117905550565b612b90614418565b508054614d799061513a565b5f825580601f10614d88575050565b601f0160209004905f5260205f2090810190610eb59190614de1565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614df5575f8155600101614de2565b5090565b8015158114610eb5575f80fd5b803563ffffffff81168114611990575f80fd5b5f805f60608486031215614e2b575f80fd5b833592506020840135614e3d81614df9565b9150614e4b60408501614e06565b90509250925092565b5f60208284031215614e64575f80fd5b5035919050565b5f8060408385031215614e7c575f80fd5b82356001600160401b03811115614e91575f80fd5b830160808186031215614ea2575f80fd5b9150614eb060208401614e06565b90509250929050565b5f8060408385031215614eca575f80fd5b82359150614eb060208401614e06565b6001600160a01b0391909116815260200190565b5f60208284031215614efe575f80fd5b61159382614e06565b5f8060408385031215614f18575f80fd5b614f2183614e06565b946020939093013593505050565b80356001600160401b0381168114611990575f80fd5b5f60208284031215614f55575f80fd5b61159382614f2f565b803561ffff81168114611990575f80fd5b5f805f60608486031215614f81575f80fd5b83356001600160401b03811115614f96575f80fd5b840160a08187031215614fa7575f80fd5b9250614fb560208501614f5e565b9150614e4b60408501614f2f565b5f6101408284031215614fd4575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b60068110614ffe57614ffe614fda565b9052565b5f5b8381101561501c578181015183820152602001615004565b50505f910152565b5f815180845261503b816020860160208601615002565b601f01601f19169290920160200192915050565b60208152615061602082018351614fee565b5f602083015160e0604084015261507c610100840182615024565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150e0575f80fd5b82356001600160401b03808211156150f6575f80fd5b818501915085601f830112615109575f80fd5b813581811115615117575f80fd5b866020828501011115615128575f80fd5b60209290920196919550909350505050565b600181811c9082168061514e57607f821691505b602082108103614fd457634e487b7160e01b5f52602260045260245ffd5b60208101610df78284614fee565b602081525f6115936020830184615024565b5f6020828403121561519c575f80fd5b5051919050565b6001600160a01b0381168114610eb5575f80fd5b5f602082840312156151c7575f80fd5b8135611593816151a3565b5f808335601e198436030181126151e7575f80fd5b8301803591506001600160401b03821115615200575f80fd5b6020019150600581901b36038213156137ba575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261523f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561527f5761527f615249565b60405290565b604080519081016001600160401b038111828210171561527f5761527f615249565b604051601f8201601f191681016001600160401b03811182821017156152cf576152cf615249565b604052919050565b5f6001600160401b038211156152ef576152ef615249565b50601f01601f191660200190565b5f82601f83011261530c575f80fd5b813561531f61531a826152d7565b6152a7565b818152846020838601011115615333575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561535f575f80fd5b61536761525d565b82356001600160401b038082111561537d575f80fd5b615389368387016152fd565b8352602085013591508082111561539e575f80fd5b506153ab368286016152fd565b6020830152506153bd60408401614f2f565b604082015292915050565b5f825161523f818460208701615002565b601f82111561062457805f5260205f20601f840160051c810160208510156153fe5750805b601f840160051c820191505b81811015611771575f815560010161540a565b81516001600160401b0381111561543657615436615249565b61544a81615444845461513a565b846153d9565b602080601f83116001811461547d575f84156154665750858301515b5f19600386901b1c1916600185901b178555610fdc565b5f85815260208120601f198616915b828110156154ab5788860151825594840194600190910190840161548c565b50858210156154c857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610df757610df76154d8565b5f63ffffffff808316818103615517576155176154d8565b6001019392505050565b8082028115828204841417610df757610df76154d8565b5f8261555257634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061556b5761556b614fda565b91905290565b5f60208083525f84546155838161513a565b806020870152604060018084165f81146155a457600181146155c0576155ed565b60ff19851660408a0152604084151560051b8a010195506155ed565b895f5260205f205f5b858110156155e45781548b82018601529083019088016155c9565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611fcc57611fcc6154d8565b6001600160401b03828116828216039080821115611fcc57611fcc6154d8565b805161199081614df9565b5f8060408385031215615666575f80fd5b82516001600160401b038082111561567c575f80fd5b908401906060828703121561568f575f80fd5b61569761525d565b825181526020808401516156aa816151a3565b828201526040840151838111156156bf575f80fd5b80850194505087601f8501126156d3575f80fd5b835192506156e361531a846152d7565b83815288828587010111156156f6575f80fd5b61570584838301848801615002565b8060408401525081955061571a81880161564a565b9450505050509250929050565b81810381811115610df757610df76154d8565b5f808335601e1984360301811261574f575f80fd5b8301803591506001600160401b03821115615768575f80fd5b6020019150368190038213156137ba575f80fd5b5f885161578d818460208d01615002565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b9485526001600160401b03938416602086015291831660408501528216606084015216608082015260a00190565b6001600160401b03818116838216028082169190828114615836576158366154d8565b505092915050565b5f8235603e1983360301811261523f575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615890575f80fd5b615898615285565b6158a183614e06565b81526020808401356001600160401b03808211156158bd575f80fd5b9085019036601f8301126158cf575f80fd5b8135818111156158e1576158e1615249565b8060051b91506158f28483016152a7565b818152918301840191848101903684111561590b575f80fd5b938501935b838510156159355784359250615925836151a3565b8282529385019390850190615910565b94860194909452509295945050505050565b5f60208284031215615957575f80fd5b61159382614f5e565b5f60208284031215615970575f80fd5b813560ff81168114611593575f80fd5b5f6001600160401b03808316818103615517576155176154d8565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516159e181602a850160208b01615002565b8651908301906159f881602a840160208b01615002565b60c087901b6001600160c01b031916602a9290910191820152615a2a603282018660e01b6001600160e01b0319169052565b615a43603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a66818460208801615002565b60609390931b6001600160601b0319169190920190815260140192915050565b5f8451615a97818460208901615002565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615ad2818460208801615002565b60c09390931b6001600160c01b031916919092019081526008019291505056fea164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index a072d6ff7..26d2e2aa7 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -80,7 +80,7 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613a5c380380613a5c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61390f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612cb7565b610312565b005b610149610159366004612ce6565b610529565b61014961016c366004612d34565b610a53565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612cb7565b610a61565b6040516001600160401b03909116815260200161018a565b610149610a75565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612cb7565b610a88565b6101cd61025a366004612d63565b610a9d565b61014961026d366004612d34565b610ab9565b6102216005600160991b0181565b6101cd5f805160206138c383398151915281565b6101496102a2366004612cb7565b610c42565b6101e3601481565b6101496102bd366004612dbc565b610d7f565b6102d56102d0366004612cb7565b610e8d565b60405161018a9190612e79565b6101a66202a30081565b6101496102fa366004612ef9565b610fdc565b6101cd61030d366004612f1b565b611019565b5f8181525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561035f5761035f612df8565b600581111561037057610370612df8565b815260200160018201805461038490612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612f86565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612df8565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611074565b6040518263ffffffff1660e01b81526004016104e39190612fcc565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612fde565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206138c38339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612fde565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612ef9565b6001600160a01b03161461065f5761063a6060840160408501612ef9565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612ff5565b905090505f805b828163ffffffff161015610955575f6106906060880188612ff5565b8363ffffffff168181106106a6576106a661303a565b90506020028101906106b8919061304e565b6106c190613172565b80516040519192505f9160088801916106d9916131eb565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612fcc565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610752916131eb565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612fde565b90508086600801835f01516040516107a891906131eb565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612df8565b0217905550602082015160018201906108439082613247565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e891168561331a565b82516040519195506108f9916131eb565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e9061332d565b9050610674565b5060048301819055600183015460649061097990600160401b900460ff168361334f565b101561099b57604051635943317f60e01b815260048101829052602401610499565b5f6109b16109a8866110c3565b604001516111d9565b90505f6109bd87611366565b90505f6002826040516109d091906131eb565b602060405180830381855afa1580156109eb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a0e9190612fde565b9050828114610a3a57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a5c81611540565b505050565b5f610a6b82610e8d565b6080015192915050565b610a7d61187e565b610a865f6118d9565b565b610a9061187e565b610a9981611949565b5050565b5f610aa661187e565b610ab08383611c2d565b90505b92915050565b5f805160206138c38339815191525f80610ade610ad5856110c3565b604001516121a5565b9150915080610b0457604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610b1e90612f86565b90505f03610b425760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b6857610b68612df8565b14610b9b575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f8281526006840160205260408120610bb391612c2b565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206138c38339815191529190610c8990612f86565b90505f03610cad5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610cd357610cd3612df8565b14610d06575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d3f9190600401613366565b6020604051808303815f875af1158015610d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190612fde565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dc35750825b90505f826001600160401b03166001148015610dde5750303b155b905081158015610dec575080155b15610e0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3457845460ff60401b1916600160401b1785555b610e3e8787612361565b8315610e8457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e95612c62565b5f8281525f805160206138e3833981519152602052604090819020815160e0810190925280545f805160206138c3833981519152929190829060ff166005811115610ee257610ee2612df8565b6005811115610ef357610ef3612df8565b8152602001600182018054610f0790612f86565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3390612f86565b8015610f7e5780601f10610f5557610100808354040283529160200191610f7e565b820191905f5260205f20905b815481529060010190602001808311610f6157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fe461187e565b6001600160a01b03811661100d57604051631e4fbdf760e01b81525f6004820152602401610499565b611016816118d9565b50565b6040515f905f805160206138c3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061105c90869086906133f0565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611127573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261114e919081019061340e565b915091508061117057604051636b2f19e960e01b815260040160405180910390fd5b815115611196578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156111d2576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f815160261461120e57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561125d576112258160016134e0565b61123090600861334f565b61ffff168482815181106112465761124661303a565b016020015160f81c901b9190911790600101611211565b5061ffff8116156112875760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112e25761129e8160036134e0565b6112a990600861334f565b63ffffffff16856112bb83600261331a565b815181106112cb576112cb61303a565b016020015160f81c901b919091179060010161128a565b5063ffffffff81161561130857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561135d5761131f81601f6134e0565b61132a90600861334f565b8661133683600661331a565b815181106113465761134661303a565b016020015160f81c901b919091179060010161130b565b50949350505050565b60605f8083356020850135601461138287870160408901612ef9565b61138f6060890189612ff5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6114156060850185612ff5565b90508110156111d2578161142c6060860186612ff5565b8381811061143c5761143c61303a565b905060200281019061144e919061304e565b61145890806134f3565b90506114676060870187612ff5565b848181106114775761147761303a565b9050602002810190611489919061304e565b61149390806134f3565b6114a06060890189612ff5565b868181106114b0576114b061303a565b90506020028101906114c2919061304e565b6114d09060208101906134f3565b6114dd60608b018b612ff5565b888181106114ed576114ed61303a565b90506020028101906114ff919061304e565b611510906060810190604001613535565b604051602001611526979695949392919061354e565b60408051601f198184030181529190529150600101611408565b5f611549612c62565b5f805160206138c38339815191525f80611565610ad5876110c3565b91509150801561158c57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156115bd576115bd612df8565b60058111156115ce576115ce612df8565b81526020016001820180546115e290612f86565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90612f86565b80156116595780601f1061163057610100808354040283529160200191611659565b820191905f5260205f20905b81548152906001019060200180831161163c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156116c4576116c4612df8565b141580156116e557506001815160058111156116e2576116e2612df8565b14155b1561170657805160405163170cc93360e21b81526104999190600401612fbe565b60038151600581111561171b5761171b612df8565b03611729576004815261172e565b600581525b83600801816020015160405161174491906131eb565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561178857611788612df8565b0217905550602082015160018201906117a19082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561184757611847612df8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118b07f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a865760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611951612c62565b5f8281525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561199e5761199e612df8565b60058111156119af576119af612df8565b81526020016001820180546119c390612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546119ef90612f86565b8015611a3a5780601f10611a1157610100808354040283529160200191611a3a565b820191905f5260205f20905b815481529060010190602001808311611a1d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611aa857611aa8612df8565b14611adb575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611b1f57611b1f612df8565b021790555060208201516001820190611b389082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611bd6858261237b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c7157604051637fab81e560e01b815260040160405180910390fd5b5f805160206138c383398151915242611c906060860160408701613535565b6001600160401b0316111580611cca5750611cae6202a3004261331a565b611cbe6060860160408701613535565b6001600160401b031610155b15611d0457611cdf6060850160408601613535565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611d19611d1460608601866135b7565b6124d2565b611d29611d1460808601866135b7565b6030611d3860208601866134f3565b905014611d6a57611d4c60208501856134f3565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d7484806134f3565b90505f03611da157611d8684806134f3565b604051633e08a12560e11b81526004016104999291906135cb565b5f60088201611db086806134f3565b604051611dbe9291906133f0565b90815260200160405180910390205414611df757611ddc84806134f3565b60405163a41f772f60e01b81526004016104999291906135cb565b611e01835f61263b565b6040805160e08101909152815481525f908190611f0d9060208101611e2689806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e6e908a018a6134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611eb760608a0160408b01613535565b6001600160401b03168152602001611ed260608a018a6135b7565b611edb906135f9565b8152602001611eed60808a018a6135b7565b611ef6906135f9565b8152602001876001600160401b031681525061285e565b5f82815260068601602052604090209193509150611f2b8282613247565b508160088401611f3b88806134f3565b604051611f499291906133f0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f85908590600401612fcc565b6020604051808303815f875af1158015611fa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc59190612fde565b6040805160e081019091529091508060018152602001611fe589806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561207457612074612df8565b02179055506020820151600182019061208d9082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061212b88806134f3565b6040516121399291906133f0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906121779190613535565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8082516027146121db57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b600281101561222a576121f28160016134e0565b6121fd90600861334f565b61ffff168582815181106122135761221361303a565b016020015160f81c901b91909117906001016121de565b5061ffff8116156122545760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156122af5761226b8160036134e0565b61227690600861334f565b63ffffffff168661228883600261331a565b815181106122985761229861303a565b016020015160f81c901b9190911790600101612257565b5063ffffffff81166002146122d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561232c576122ee81601f6134e0565b6122f990600861334f565b8761230583600661331a565b815181106123155761231561303a565b016020015160f81c901b91909117906001016122da565b505f866026815181106123415761234161303a565b016020015191976001600160f81b03199092161515965090945050505050565b612369612a4b565b61237282612a94565b610a9981612aad565b5f8281525f805160206138e3833981519152602052604081206002015481905f805160206138c383398151915290600160801b90046001600160401b03166123c3858261263b565b5f6123cd87612abe565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241d8a858b611074565b6040518263ffffffff1660e01b81526004016124399190612fcc565b6020604051808303815f875af1158015612455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124799190612fde565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124df6020820182612d34565b63ffffffff161580156124ff57506124fa6020820182612ff5565b151590505b15612546576125116020820182612d34565b61251e6020830183612ff5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6125536020820182612ff5565b90506125626020830183612d34565b63ffffffff16111561257b576125116020820182612d34565b60015b61258b6020830183612ff5565b9050811015610a99576125a16020830183612ff5565b6125ac6001846134e0565b8181106125bb576125bb61303a565b90506020020160208101906125d09190612ef9565b6001600160a01b03166125e66020840184612ff5565b838181106125f6576125f661303a565b905060200201602081019061260b9190612ef9565b6001600160a01b0316101561263357604051630dbc8d5f60e31b815260040160405180910390fd5b60010161257e565b5f805160206138c38339815191525f6001600160401b03808416908516111561266f5761266883856136c0565b905061267c565b61267984846136c0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806126de5750600184015481516126da916001600160401b03169061331a565b8210155b15612704576001600160401b038316606082015281815260408101516020820152612723565b828160600181815161271691906136e0565b6001600160401b03169052505b6060810151612733906064613700565b602082015160018601546001600160401b03929092169161275e9190600160401b900460ff1661334f565b101561278e57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b0316816040018181516127a9919061331a565b9052506040810180516001600160401b03871691906127c99083906134e0565b905250600184015460408201516064916127ee91600160401b90910460ff169061334f565b1015612815578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146128875760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986128c8988a98600198929792969095909490939092910161372b565b60405160208183030381529060405290505f5b8460800151602001515181101561293a578185608001516020015182815181106129075761290761303a565b60200260200101516040516020016129209291906137e5565b60408051601f1981840301815291905291506001016128db565b5060a084015180516020918201515160405161295a93859392910161381b565b60405160208183030381529060405290505f5b8460a0015160200151518110156129cc57818560a001516020015182815181106129995761299961303a565b60200260200101516040516020016129b29291906137e5565b60408051601f19818403018152919052915060010161296d565b5060c08401516040516129e3918391602001613856565b6040516020818303038152906040529050600281604051612a0491906131eb565b602060405180830381855afa158015612a1f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a429190612fde565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a8657604051631afcd79f60e31b815260040160405180910390fd5b612a9c612a4b565b612aa4612b33565b61101681612b3b565b612ab5612a4b565b61101681612c23565b5f8181525f805160206138e38339815191526020526040812060020180545f805160206138c38339815191529190600890612b0890600160401b90046001600160401b0316613887565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a86612a4b565b612b43612a4b565b80355f805160206138c38339815191529081556014612b6860608401604085016138a2565b60ff161180612b875750612b8260608301604084016138a2565b60ff16155b15612bbb57612b9c60608301604084016138a2565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612bcb60608301604084016138a2565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612bfc6040830160208401613535565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fe4612a4b565b508054612c3790612f86565b5f825580601f10612c46575050565b601f0160209004905f5260205f20908101906110169190612c9f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612cb3575f8155600101612ca0565b5090565b5f60208284031215612cc7575f80fd5b5035919050565b803563ffffffff81168114612ce1575f80fd5b919050565b5f8060408385031215612cf7575f80fd5b82356001600160401b03811115612d0c575f80fd5b830160808186031215612d1d575f80fd5b9150612d2b60208401612cce565b90509250929050565b5f60208284031215612d44575f80fd5b610ab082612cce565b80356001600160401b0381168114612ce1575f80fd5b5f8060408385031215612d74575f80fd5b82356001600160401b03811115612d89575f80fd5b830160a08186031215612d9a575f80fd5b9150612d2b60208401612d4d565b6001600160a01b0381168114611016575f80fd5b5f808284036080811215612dce575f80fd5b6060811215612ddb575f80fd5b508291506060830135612ded81612da8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612e2857634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612e46578181015183820152602001612e2e565b50505f910152565b5f8151808452612e65816020860160208601612e2c565b601f01601f19169290920160200192915050565b60208152612e8b602082018351612e0c565b5f602083015160e06040840152612ea6610100840182612e4e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612f09575f80fd5b8135612f1481612da8565b9392505050565b5f8060208385031215612f2c575f80fd5b82356001600160401b0380821115612f42575f80fd5b818501915085601f830112612f55575f80fd5b813581811115612f63575f80fd5b866020828501011115612f74575f80fd5b60209290920196919550909350505050565b600181811c90821680612f9a57607f821691505b602082108103612fb857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ab38284612e0c565b602081525f610ab06020830184612e4e565b5f60208284031215612fee575f80fd5b5051919050565b5f808335601e1984360301811261300a575f80fd5b8301803591506001600160401b03821115613023575f80fd5b6020019150600581901b36038213156124cb575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613062575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130a2576130a261306c565b60405290565b604080519081016001600160401b03811182821017156130a2576130a261306c565b604051601f8201601f191681016001600160401b03811182821017156130f2576130f261306c565b604052919050565b5f6001600160401b038211156131125761311261306c565b50601f01601f191660200190565b5f82601f83011261312f575f80fd5b813561314261313d826130fa565b6130ca565b818152846020838601011115613156575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215613182575f80fd5b61318a613080565b82356001600160401b03808211156131a0575f80fd5b6131ac36838701613120565b835260208501359150808211156131c1575f80fd5b506131ce36828601613120565b6020830152506131e060408401612d4d565b604082015292915050565b5f8251613062818460208701612e2c565b601f821115610a5c57805f5260205f20601f840160051c810160208510156132215750805b601f840160051c820191505b81811015613240575f815560010161322d565b5050505050565b81516001600160401b038111156132605761326061306c565b6132748161326e8454612f86565b846131fc565b602080601f8311600181146132a7575f84156132905750858301515b5f19600386901b1c1916600185901b1785556132fe565b5f85815260208120601f198616915b828110156132d5578886015182559484019460019091019084016132b6565b50858210156132f257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ab357610ab3613306565b5f63ffffffff80831681810361334557613345613306565b6001019392505050565b8082028115828204841417610ab357610ab3613306565b5f60208083525f845461337881612f86565b806020870152604060018084165f811461339957600181146133b5576133e2565b60ff19851660408a0152604084151560051b8a010195506133e2565b895f5260205f205f5b858110156133d95781548b82018601529083019088016133be565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612ce1575f80fd5b5f806040838503121561341f575f80fd5b82516001600160401b0380821115613435575f80fd5b9084019060608287031215613448575f80fd5b613450613080565b8251815260208084015161346381612da8565b82820152604084015183811115613478575f80fd5b80850194505087601f85011261348c575f80fd5b8351925061349c61313d846130fa565b83815288828587010111156134af575f80fd5b6134be84838301848801612e2c565b806040840152508195506134d38188016133ff565b9450505050509250929050565b81810381811115610ab357610ab3613306565b5f808335601e19843603018112613508575f80fd5b8301803591506001600160401b03821115613521575f80fd5b6020019150368190038213156124cb575f80fd5b5f60208284031215613545575f80fd5b610ab082612d4d565b5f885161355f818460208d01612e2c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e19833603018112613062575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215613609575f80fd5b6136116130a8565b61361a83612cce565b81526020808401356001600160401b0380821115613636575f80fd5b9085019036601f830112613648575f80fd5b81358181111561365a5761365a61306c565b8060051b915061366b8483016130ca565b8181529183018401918481019036841115613684575f80fd5b938501935b838510156136ae578435925061369e83612da8565b8282529385019390850190613689565b94860194909452509295945050505050565b6001600160401b038281168282160390808211156111d2576111d2613306565b6001600160401b038181168382160190808211156111d2576111d2613306565b6001600160401b0381811683821602808216919082811461372357613723613306565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161377181602a850160208b01612e2c565b86519083019061378881602a840160208b01612e2c565b60c087901b6001600160c01b031916602a92909101918201526137ba603282018660e01b6001600160e01b0319169052565b6137d3603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516137f6818460208801612e2c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f845161382c818460208901612e2c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351613867818460208801612e2c565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b0380831681810361334557613345613306565b5f602082840312156138b2575f80fd5b813560ff81168114612f14575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161395638038061395683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138098061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b61461028b578063d588c18f14610293578063d5f20ff6146102a6578063df93d8de146102c6578063f2fde38b146102d0578063fd7ac5e7146102e3575f80fd5b80639ba96b861461021d578063a3a65e4814610230578063b771b3bc14610243578063bc5fbfec14610251578063bee0a03f14610278575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d41461020a575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612be2565b6102f6565b005b610149610159366004612c11565b610502565b61014961016c366004612c5f565b610a00565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612be2565b610a0e565b6040516001600160401b03909116815260200161018a565b610149610a22565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b6101fd610a35565b60405161018a9190612c78565b610149610218366004612be2565b610a63565b6101cd61022b366004612ca2565b610a78565b61014961023e366004612c5f565b610a94565b6101fd6005600160991b0181565b6101cd7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b610149610286366004612be2565b610c1a565b6101e3601481565b6101496102a1366004612cfb565b610d37565b6102b96102b4366004612be2565b610e44565b60405161018a9190612db8565b6101a66202a30081565b6101496102de366004612e38565b610f86565b6101cd6102f1366004612e5a565b610fc3565b5f6102ff610ffb565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff16600581111561033857610338612d37565b600581111561034957610349612d37565b815260200160018201805461035d90612ec5565b80601f016020809104026020016040519081016040528092919081815260200182805461038990612ec5565b80156103d45780601f106103ab576101008083540402835291602001916103d4565b820191905f5260205f20905b8154815290600101906020018083116103b757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561043f5761043f612d37565b1461047b575f8381526007830160205260409081902054905163170cc93360e21b81526104729160ff1690600401612efd565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104a08584606001515f61101f565b6040518263ffffffff1660e01b81526004016104bc9190612f0b565b6020604051808303815f875af11580156104d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fc9190612f1d565b50505050565b5f61050b610ffb565b600981015490915060ff161561053457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610577573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059b9190612f1d565b8360200135146105c4576040516372b0a7e760e11b815260208401356004820152602401610472565b306105d56060850160408601612e38565b6001600160a01b03161461060d576105f36060840160408501612e38565b604051632f88120d60e21b81526004016104729190612c78565b5f61061b6060850185612f34565b905090505f805b828163ffffffff161015610902575f61063e6060880188612f34565b8363ffffffff1681811061065457610654612f79565b90506020028101906106669190612f8d565b61066f906130b1565b80516040519192505f9160088801916106879161312a565b908152602001604051809103902054146106b757805160405163a41f772f60e01b81526104729190600401612f0b565b5f6002885f0135846040516020016106e692919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526107009161312a565b602060405180830381855afa15801561071b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061073e9190612f1d565b90508086600801835f0151604051610756919061312a565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156107d8576107d8612d37565b0217905550602082015160018201906107f19082613186565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090930151600390920180546001600160401b03191692841692909217909155830151610895911685613259565b82516040519195506108a69161312a565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a35050806108fb9061326c565b9050610622565b5060048301819055600183015460649061092690600160401b900460ff168361328e565b101561094857604051635943317f60e01b815260048101829052602401610472565b5f61095e6109558661106e565b60400151611179565b90505f61096a87611306565b90505f60028260405161097d919061312a565b602060405180830381855afa158015610998573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109bb9190612f1d565b90508281146109e757604051631872fc8d60e01b81526004810182905260248101849052604401610472565b5050506009909201805460ff1916600117905550505050565b610a09816114db565b505050565b5f610a1882610e44565b6080015192915050565b610a2a611815565b610a335f611847565b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b610a6b611815565b610a74816118b7565b5050565b5f610a81611815565b610a8b8383611b8f565b90505b92915050565b5f610a9d610ffb565b90505f80610ab6610aad8561106e565b604001516120ec565b9150915080610adc57604051632d07135360e01b81528115156004820152602401610472565b5f82815260068401602052604090208054610af690612ec5565b90505f03610b1a5760405163089938b360e11b815260048101839052602401610472565b60015f83815260078501602052604090205460ff166005811115610b4057610b40612d37565b14610b73575f8281526007840160205260409081902054905163170cc93360e21b81526104729160ff1690600401612efd565b5f8281526006840160205260408120610b8b91612b56565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f610c23610ffb565b5f8381526006820160205260409020805491925090610c4190612ec5565b90505f03610c655760405163089938b360e11b815260048101839052602401610472565b60015f83815260078301602052604090205460ff166005811115610c8b57610c8b612d37565b14610cbe575f8281526007820160205260409081902054905163170cc93360e21b81526104729160ff1690600401612efd565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610cf791906004016132a5565b6020604051808303815f875af1158015610d13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a099190612f1d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610d7b5750825b90505f826001600160401b03166001148015610d965750303b155b905081158015610da4575080155b15610dc25760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b03191660011785558315610deb57845460ff60401b1916600160401b1785555b610df587876122a8565b8315610e3b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e4c612b8d565b5f610e55610ffb565b5f84815260078201602052604090819020815160e0810190925280549293509091829060ff166005811115610e8c57610e8c612d37565b6005811115610e9d57610e9d612d37565b8152602001600182018054610eb190612ec5565b80601f0160208091040260200160405190810160405280929190818152602001828054610edd90612ec5565b8015610f285780601f10610eff57610100808354040283529160200191610f28565b820191905f5260205f20905b815481529060010190602001808311610f0b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610f8e611815565b6001600160a01b038116610fb7575f604051631e4fbdf760e01b81526004016104729190612c78565b610fc081611847565b50565b5f80610fcd610ffb565b9050806008018484604051610fe392919061332f565b90815260200160405180910390205491505092915050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156110d2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110f9919081019061334d565b915091508061111b57604051636b2f19e960e01b815260040160405180910390fd5b815115611141578151604051636ba589a560e01b81526004810191909152602401610472565b60208201516001600160a01b031615611172578160200151604051624de75d60e31b81526004016104729190612c78565b5092915050565b5f81516026146111ae57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610472565b5f805b60028110156111fd576111c581600161341f565b6111d090600861328e565b61ffff168482815181106111e6576111e6612f79565b016020015160f81c901b91909117906001016111b1565b5061ffff8116156112275760405163407b587360e01b815261ffff82166004820152602401610472565b5f805b60048110156112825761123e81600361341f565b61124990600861328e565b63ffffffff168561125b836002613259565b8151811061126b5761126b612f79565b016020015160f81c901b919091179060010161122a565b5063ffffffff8116156112a857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156112fd576112bf81601f61341f565b6112ca90600861328e565b866112d6836006613259565b815181106112e6576112e6612f79565b016020015160f81c901b91909117906001016112ab565b50949350505050565b60605f8083356020850135601461132287870160408901612e38565b61132f6060890189612f34565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6001600160601b03191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6113b06060850185612f34565b905081101561117257816113c76060860186612f34565b838181106113d7576113d7612f79565b90506020028101906113e99190612f8d565b6113f39080613432565b90506114026060870187612f34565b8481811061141257611412612f79565b90506020028101906114249190612f8d565b61142e9080613432565b61143b6060890189612f34565b8681811061144b5761144b612f79565b905060200281019061145d9190612f8d565b61146b906020810190613432565b61147860608b018b612f34565b8881811061148857611488612f79565b905060200281019061149a9190612f8d565b6114ab906060810190604001613474565b6040516020016114c1979695949392919061348d565b60408051601f1981840301815291905291506001016113a3565b5f6114e4612b8d565b5f6114ed610ffb565b90505f806114fd610aad8761106e565b91509150801561152457604051632d07135360e01b81528115156004820152602401610472565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561155557611555612d37565b600581111561156657611566612d37565b815260200160018201805461157a90612ec5565b80601f01602080910402602001604051908101604052809291908181526020018280546115a690612ec5565b80156115f15780601f106115c8576101008083540402835291602001916115f1565b820191905f5260205f20905b8154815290600101906020018083116115d457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561165c5761165c612d37565b1415801561167d575060018151600581111561167a5761167a612d37565b14155b1561169e57805160405163170cc93360e21b81526104729190600401612efd565b6003815160058111156116b3576116b3612d37565b036116c157600481526116c6565b600581525b8360080181602001516040516116dc919061312a565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561172057611720612d37565b0217905550602082015160018201906117399082613186565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b03191691909216179055805160058111156117de576117de612d37565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b3361181e610a35565b6001600160a01b031614610a33573360405163118cdaa760e01b81526004016104729190612c78565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6118bf612b8d565b5f6118c8610ffb565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600581111561190157611901612d37565b600581111561191257611912612d37565b815260200160018201805461192690612ec5565b80601f016020809104026020016040519081016040528092919081815260200182805461195290612ec5565b801561199d5780601f106119745761010080835404028352916020019161199d565b820191905f5260205f20905b81548152906001019060200180831161198057829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611a0b57611a0b612d37565b14611a3e575f8481526007830160205260409081902054905163170cc93360e21b81526104729160ff1690600401612efd565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611a8257611a82612d37565b021790555060208201516001820190611a9b9082613186565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b031916919092161790555f611b3885826122c2565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f611b98610ffb565b6009015460ff16611bbc57604051637fab81e560e01b815260040160405180910390fd5b5f611bc5610ffb565b905042611bd86060860160408701613474565b6001600160401b0316111580611c125750611bf66202a30042613259565b611c066060860160408701613474565b6001600160401b031610155b15611c4c57611c276060850160408601613474565b604051635879da1360e11b81526001600160401b039091166004820152602401610472565b611c61611c5c60608601866134f6565b61240c565b611c71611c5c60808601866134f6565b6030611c806020860186613432565b905014611cb257611c946020850185613432565b6040516326475b2f60e11b8152610472925060040190815260200190565b611cbc8480613432565b90505f03611ce957611cce8480613432565b604051633e08a12560e11b815260040161047292919061350a565b5f60088201611cf88680613432565b604051611d0692919061332f565b90815260200160405180910390205414611d3f57611d248480613432565b60405163a41f772f60e01b815260040161047292919061350a565b611d49835f612575565b6040805160e08101909152815481525f908190611e559060208101611d6e8980613432565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611db6908a018a613432565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611dff60608a0160408b01613474565b6001600160401b03168152602001611e1a60608a018a6134f6565b611e2390613538565b8152602001611e3560808a018a6134f6565b611e3e90613538565b8152602001876001600160401b031681525061279a565b5f82815260068601602052604090209193509150611e738282613186565b508160088401611e838880613432565b604051611e9192919061332f565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ecd908590600401612f0b565b6020604051808303815f875af1158015611ee9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0d9190612f1d565b6040805160e081019091529091508060018152602001611f2d8980613432565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115611fbc57611fbc612d37565b021790555060208201516001820190611fd59082613186565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c090920151600390910180546001600160401b03191691909216179055806120728880613432565b60405161208092919061332f565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906120be9190613474565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80825160271461212257825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610472565b5f805b60028110156121715761213981600161341f565b61214490600861328e565b61ffff1685828151811061215a5761215a612f79565b016020015160f81c901b9190911790600101612125565b5061ffff81161561219b5760405163407b587360e01b815261ffff82166004820152602401610472565b5f805b60048110156121f6576121b281600361341f565b6121bd90600861328e565b63ffffffff16866121cf836002613259565b815181106121df576121df612f79565b016020015160f81c901b919091179060010161219e565b5063ffffffff811660021461221e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122735761223581601f61341f565b61224090600861328e565b8761224c836006613259565b8151811061225c5761225c612f79565b016020015160f81c901b9190911790600101612221565b505f8660268151811061228857612288612f79565b016020015191976001600160f81b03199092161515965090945050505050565b6122b0612987565b6122b9826129d0565b610a74816129e9565b5f805f6122cd610ffb565b5f868152600782016020526040902060020154909150600160801b90046001600160401b03166122fd8582612575565b5f612307876129fa565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123578a858b61101f565b6040518263ffffffff1660e01b81526004016123739190612f0b565b6020604051808303815f875af115801561238f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b39190612f1d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124196020820182612c5f565b63ffffffff1615801561243957506124346020820182612f34565b151590505b156124805761244b6020820182612c5f565b6124586020830183612f34565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610472565b61248d6020820182612f34565b905061249c6020830183612c5f565b63ffffffff1611156124b55761244b6020820182612c5f565b60015b6124c56020830183612f34565b9050811015610a74576124db6020830183612f34565b6124e660018461341f565b8181106124f5576124f5612f79565b905060200201602081019061250a9190612e38565b6001600160a01b03166125206020840184612f34565b8381811061253057612530612f79565b90506020020160208101906125459190612e38565b6001600160a01b0316101561256d57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016124b8565b5f61257e610ffb565b90505f826001600160401b0316846001600160401b031611156125ac576125a583856135ff565b90506125b9565b6125b684846135ff565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061261b575060018401548151612617916001600160401b031690613259565b8210155b15612641576001600160401b038316606082015281815260408101516020820152612660565b8281606001818151612653919061361f565b6001600160401b03169052505b606081015161267090606461363f565b602082015160018601546001600160401b03929092169161269b9190600160401b900460ff1661328e565b10156126cb57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610472565b856001600160401b0316816040018181516126e69190613259565b9052506040810180516001600160401b038716919061270690839061341f565b9052506001840154604082015160649161272b91600160401b90910460ff169061328e565b1015612752578060400151604051635943317f60e01b815260040161047291815260200190565b80516002850155602081015160038501556040810151600485015560600151600590930180546001600160401b0319166001600160401b039094169390931790925550505050565b5f60608260400151516030146127c35760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98612804988a98600198929792969095909490939092910161366a565b60405160208183030381529060405290505f5b846080015160200151518110156128765781856080015160200151828151811061284357612843612f79565b602002602001015160405160200161285c929190613724565b60408051601f198184030181529190529150600101612817565b5060a0840151805160209182015151604051612896938593929101613755565b60405160208183030381529060405290505f5b8460a00151602001515181101561290857818560a001516020015182815181106128d5576128d5612f79565b60200260200101516040516020016128ee929190613724565b60408051601f1981840301815291905291506001016128a9565b5060c084015160405161291f918391602001613790565b6040516020818303038152906040529050600281604051612940919061312a565b602060405180830381855afa15801561295b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061297e9190612f1d565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a3357604051631afcd79f60e31b815260040160405180910390fd5b6129d8612987565b6129e0612a63565b610fc081612a6b565b6129f1612987565b610fc081612b4e565b5f80612a04610ffb565b5f8481526007820160205260409020600201805491925090600890612a3890600160401b90046001600160401b03166137c1565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a33612987565b612a73612987565b5f612a7c610ffb565b8235815590506014612a9460608401604085016137dc565b60ff161180612ab35750612aae60608301604084016137dc565b60ff16155b15612ae757612ac860608301604084016137dc565b604051634a59bbff60e11b815260ff9091166004820152602401610472565b612af760608301604084016137dc565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612b286040830160208401613474565b60019190910180546001600160401b0319166001600160401b0390921691909117905550565b610f8e612987565b508054612b6290612ec5565b5f825580601f10612b71575050565b601f0160209004905f5260205f2090810190610fc09190612bca565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612bde575f8155600101612bcb565b5090565b5f60208284031215612bf2575f80fd5b5035919050565b803563ffffffff81168114612c0c575f80fd5b919050565b5f8060408385031215612c22575f80fd5b82356001600160401b03811115612c37575f80fd5b830160808186031215612c48575f80fd5b9150612c5660208401612bf9565b90509250929050565b5f60208284031215612c6f575f80fd5b610a8b82612bf9565b6001600160a01b0391909116815260200190565b80356001600160401b0381168114612c0c575f80fd5b5f8060408385031215612cb3575f80fd5b82356001600160401b03811115612cc8575f80fd5b830160a08186031215612cd9575f80fd5b9150612c5660208401612c8c565b6001600160a01b0381168114610fc0575f80fd5b5f808284036080811215612d0d575f80fd5b6060811215612d1a575f80fd5b508291506060830135612d2c81612ce7565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612d6757634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612d85578181015183820152602001612d6d565b50505f910152565b5f8151808452612da4816020860160208601612d6b565b601f01601f19169290920160200192915050565b60208152612dca602082018351612d4b565b5f602083015160e06040840152612de5610100840182612d8d565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612e48575f80fd5b8135612e5381612ce7565b9392505050565b5f8060208385031215612e6b575f80fd5b82356001600160401b0380821115612e81575f80fd5b818501915085601f830112612e94575f80fd5b813581811115612ea2575f80fd5b866020828501011115612eb3575f80fd5b60209290920196919550909350505050565b600181811c90821680612ed957607f821691505b602082108103612ef757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610a8e8284612d4b565b602081525f610a8b6020830184612d8d565b5f60208284031215612f2d575f80fd5b5051919050565b5f808335601e19843603018112612f49575f80fd5b8301803591506001600160401b03821115612f62575f80fd5b6020019150600581901b3603821315612405575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612fa1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612fe157612fe1612fab565b60405290565b604080519081016001600160401b0381118282101715612fe157612fe1612fab565b604051601f8201601f191681016001600160401b038111828210171561303157613031612fab565b604052919050565b5f6001600160401b0382111561305157613051612fab565b50601f01601f191660200190565b5f82601f83011261306e575f80fd5b813561308161307c82613039565b613009565b818152846020838601011115613095575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156130c1575f80fd5b6130c9612fbf565b82356001600160401b03808211156130df575f80fd5b6130eb3683870161305f565b83526020850135915080821115613100575f80fd5b5061310d3682860161305f565b60208301525061311f60408401612c8c565b604082015292915050565b5f8251612fa1818460208701612d6b565b601f821115610a0957805f5260205f20601f840160051c810160208510156131605750805b601f840160051c820191505b8181101561317f575f815560010161316c565b5050505050565b81516001600160401b0381111561319f5761319f612fab565b6131b3816131ad8454612ec5565b8461313b565b602080601f8311600181146131e6575f84156131cf5750858301515b5f19600386901b1c1916600185901b17855561323d565b5f85815260208120601f198616915b82811015613214578886015182559484019460019091019084016131f5565b508582101561323157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a8e57610a8e613245565b5f63ffffffff80831681810361328457613284613245565b6001019392505050565b8082028115828204841417610a8e57610a8e613245565b5f60208083525f84546132b781612ec5565b806020870152604060018084165f81146132d857600181146132f457613321565b60ff19851660408a0152604084151560051b8a01019550613321565b895f5260205f205f5b858110156133185781548b82018601529083019088016132fd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612c0c575f80fd5b5f806040838503121561335e575f80fd5b82516001600160401b0380821115613374575f80fd5b9084019060608287031215613387575f80fd5b61338f612fbf565b825181526020808401516133a281612ce7565b828201526040840151838111156133b7575f80fd5b80850194505087601f8501126133cb575f80fd5b835192506133db61307c84613039565b83815288828587010111156133ee575f80fd5b6133fd84838301848801612d6b565b8060408401525081955061341281880161333e565b9450505050509250929050565b81810381811115610a8e57610a8e613245565b5f808335601e19843603018112613447575f80fd5b8301803591506001600160401b03821115613460575f80fd5b602001915036819003821315612405575f80fd5b5f60208284031215613484575f80fd5b610a8b82612c8c565b5f885161349e818460208d01612d6b565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e19833603018112612fa1575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215613548575f80fd5b613550612fe7565b61355983612bf9565b81526020808401356001600160401b0380821115613575575f80fd5b9085019036601f830112613587575f80fd5b81358181111561359957613599612fab565b8060051b91506135aa848301613009565b81815291830184019184810190368411156135c3575f80fd5b938501935b838510156135ed57843592506135dd83612ce7565b82825293850193908501906135c8565b94860194909452509295945050505050565b6001600160401b0382811682821603908082111561117257611172613245565b6001600160401b0381811683821601908082111561117257611172613245565b6001600160401b0381811683821602808216919082811461366257613662613245565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516136b081602a850160208b01612d6b565b8651908301906136c781602a840160208b01612d6b565b60c087901b6001600160c01b031916602a92909101918201526136f9603282018660e01b6001600160e01b0319169052565b613712603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351613735818460208801612d6b565b60609390931b6001600160601b0319169190920190815260140192915050565b5f8451613766818460208901612d6b565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516137a1818460208801612d6b565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b0380831681810361328457613284613245565b5f602082840312156137ec575f80fd5b813560ff81168114612e53575f80fdfea164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index b93d76422..10713f2b2 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -54,7 +54,7 @@ go install github.com/ava-labs/subnet-evm/cmd/abigen@${SUBNET_EVM_VERSION} # compilations that did not generate new ABI files. echo "Building Contracts" cd $TELEPORTER_PATH -forge build --skip test --force --extra-output-files abi bin +forge build --skip test --optimizer-runs 100 --force --extra-output-files abi bin function convertToLower() { if [ "$ARCH" = 'arm64' ]; then diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index a24a722a4..e20dbfbe2 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -74,14 +74,6 @@ echo "Copied ${BASEDIR}/subnet-evm/subnet-evm binary to ${BASEDIR}/avalanchego/p export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego -cd $TELEPORTER_PATH -if command -v forge &> /dev/null; then - forge build --skip test --optimizer-runs 0 -else - echo "Forge command not found, attempting to use from $HOME" - $HOME/.foundry/bin/forge build -fi - cd "$TELEPORTER_PATH" # Build ginkgo # to install the ginkgo binary (required for test build and run) From f07e94cfff7b7fce1d2a0c996b86c112822317fa Mon Sep 17 00:00:00 2001 From: Michael Kaplan Date: Thu, 24 Oct 2024 14:27:34 -0400 Subject: [PATCH 32/35] Build before E2E tests run --- scripts/local/e2e_test.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index e20dbfbe2..a24a722a4 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -74,6 +74,14 @@ echo "Copied ${BASEDIR}/subnet-evm/subnet-evm binary to ${BASEDIR}/avalanchego/p export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego +cd $TELEPORTER_PATH +if command -v forge &> /dev/null; then + forge build --skip test --optimizer-runs 0 +else + echo "Forge command not found, attempting to use from $HOME" + $HOME/.foundry/bin/forge build +fi + cd "$TELEPORTER_PATH" # Build ginkgo # to install the ginkgo binary (required for test build and run) From d30db9ac10309dd8b0194eb308b8a5d260d2bb51 Mon Sep 17 00:00:00 2001 From: Michael Kaplan Date: Thu, 24 Oct 2024 14:58:02 -0400 Subject: [PATCH 33/35] Build before E2E tests run --- scripts/local/e2e_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index a24a722a4..fd5647981 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -76,7 +76,7 @@ export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego cd $TELEPORTER_PATH if command -v forge &> /dev/null; then - forge build --skip test --optimizer-runs 0 + forge build --skip test --optimizer-runs 100 else echo "Forge command not found, attempting to use from $HOME" $HOME/.foundry/bin/forge build From 509a164729b4518c4c162d20512d6f7c3d013509 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Mon, 28 Oct 2024 09:42:20 -0400 Subject: [PATCH 34/35] bump subnet-evm to 0.6.11 --- go.mod | 8 ++++---- go.sum | 6 ++++++ lib/subnet-evm | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index e10c64822..7d134b73a 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,12 @@ module github.com/ava-labs/teleporter go 1.22.8 require ( - github.com/ava-labs/avalanchego v1.11.11 + github.com/ava-labs/avalanchego v1.11.12 github.com/supranational/blst v0.3.11 // indirect ) require ( - github.com/ava-labs/subnet-evm v0.6.9 + github.com/ava-labs/subnet-evm v0.6.11 github.com/ethereum/go-ethereum v1.13.14 github.com/onsi/ginkgo/v2 v2.20.2 github.com/onsi/gomega v1.34.2 @@ -23,7 +23,7 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/ava-labs/coreth v0.13.8-fixed-genesis-upgrade.0.20240815193440-a96bc921e732 // indirect + github.com/ava-labs/coreth v0.13.8 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect @@ -67,7 +67,7 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/rpc v1.2.0 // indirect - github.com/gorilla/websocket v1.4.2 // indirect + github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect diff --git a/go.sum b/go.sum index 56b8188b8..0c2208011 100644 --- a/go.sum +++ b/go.sum @@ -58,10 +58,15 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/ava-labs/avalanchego v1.11.11 h1:MIQq8xRavRj4ZXHA4G+aMiymig7SOScGOG1SApmMvBc= github.com/ava-labs/avalanchego v1.11.11/go.mod h1:yFx3V31Jy9NFa8GZlgGnwiVf8KGjeF2+Uc99l9Scd/8= +github.com/ava-labs/avalanchego v1.11.12 h1:fpGs7xsHYjswIik3tdlGcDaHXh22DLcuf5Ri5+u4RNM= +github.com/ava-labs/avalanchego v1.11.12/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= github.com/ava-labs/coreth v0.13.8-fixed-genesis-upgrade.0.20240815193440-a96bc921e732 h1:wlhGJbmb7s3bU2QWtxKjscGjfHknQiq+cVhhUjONsB8= github.com/ava-labs/coreth v0.13.8-fixed-genesis-upgrade.0.20240815193440-a96bc921e732/go.mod h1:RkQLaQ961Xe/sUb3ycn4Qi18vPPuEetTqDf2eDcquAs= +github.com/ava-labs/coreth v0.13.8/go.mod h1:t3BSv/eQv0AlDPMfEDCMMoD/jq1RkUsbFzQAFg5qBcE= github.com/ava-labs/subnet-evm v0.6.9 h1:0FSPjbysSudOlMD/d0ivkli50d2ixpX3sXCi7XHfPbc= github.com/ava-labs/subnet-evm v0.6.9/go.mod h1:dw4kg0o58dvYlndj2ZcwB7hioRc1kjg00yXYrcSmnj8= +github.com/ava-labs/subnet-evm v0.6.11 h1:XgIAn9ihPyGjrBFD2rXg2H76HFl6htliHabN0fjciaQ= +github.com/ava-labs/subnet-evm v0.6.11/go.mod h1:fP46lzBtiniRfpNH+Qu9BFvSsa02YGkAobxinZ78gDU= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -318,6 +323,7 @@ github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36j github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= diff --git a/lib/subnet-evm b/lib/subnet-evm index a42c7c151..1b017f1d4 160000 --- a/lib/subnet-evm +++ b/lib/subnet-evm @@ -1 +1 @@ -Subproject commit a42c7c1518d4cf7f8220ff0c5b946f055e8f3b34 +Subproject commit 1b017f1d4371e485a6d650d7f5a10dd5288745bc From 82a16c037bac2c54dbcf5ade136d8b11b81b7c00 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Mon, 28 Oct 2024 10:24:51 -0400 Subject: [PATCH 35/35] go mod tidy --- go.mod | 1 - go.sum | 12 ++---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 7d134b73a..1e67c43ca 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,6 @@ require ( github.com/dlclark/regexp2 v1.7.0 // indirect github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/fjl/memsize v0.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect diff --git a/go.sum b/go.sum index 0c2208011..dc54ce618 100644 --- a/go.sum +++ b/go.sum @@ -56,15 +56,10 @@ github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/ava-labs/avalanchego v1.11.11 h1:MIQq8xRavRj4ZXHA4G+aMiymig7SOScGOG1SApmMvBc= -github.com/ava-labs/avalanchego v1.11.11/go.mod h1:yFx3V31Jy9NFa8GZlgGnwiVf8KGjeF2+Uc99l9Scd/8= github.com/ava-labs/avalanchego v1.11.12 h1:fpGs7xsHYjswIik3tdlGcDaHXh22DLcuf5Ri5+u4RNM= github.com/ava-labs/avalanchego v1.11.12/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= -github.com/ava-labs/coreth v0.13.8-fixed-genesis-upgrade.0.20240815193440-a96bc921e732 h1:wlhGJbmb7s3bU2QWtxKjscGjfHknQiq+cVhhUjONsB8= -github.com/ava-labs/coreth v0.13.8-fixed-genesis-upgrade.0.20240815193440-a96bc921e732/go.mod h1:RkQLaQ961Xe/sUb3ycn4Qi18vPPuEetTqDf2eDcquAs= +github.com/ava-labs/coreth v0.13.8 h1:f14X3KgwHl9LwzfxlN6S4bbn5VA2rhEsNnHaRLSTo/8= github.com/ava-labs/coreth v0.13.8/go.mod h1:t3BSv/eQv0AlDPMfEDCMMoD/jq1RkUsbFzQAFg5qBcE= -github.com/ava-labs/subnet-evm v0.6.9 h1:0FSPjbysSudOlMD/d0ivkli50d2ixpX3sXCi7XHfPbc= -github.com/ava-labs/subnet-evm v0.6.9/go.mod h1:dw4kg0o58dvYlndj2ZcwB7hioRc1kjg00yXYrcSmnj8= github.com/ava-labs/subnet-evm v0.6.11 h1:XgIAn9ihPyGjrBFD2rXg2H76HFl6htliHabN0fjciaQ= github.com/ava-labs/subnet-evm v0.6.11/go.mod h1:fP46lzBtiniRfpNH+Qu9BFvSsa02YGkAobxinZ78gDU= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= @@ -181,8 +176,6 @@ github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0Hw github.com/ethereum/go-ethereum v1.13.14/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -321,8 +314,7 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/rpc v1.2.0 h1:WvvdC2lNeT1SP32zrIce5l0ECBfbAlmrmSBsuc57wfk= github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=